Pregunta

Estoy portar más de un código de plantilla de Windows y estoy golpeando algunas diferencias compilador en el SDK iPhone 3.2.

Código original dentro de la función miembro de una plantilla de clase es:

return BinarySearch<uint32, CSimpleKey<T> >(key);

donde BinarySearch es un método heredado de otra plantilla.

Esto produce el error siguiente:

csimplekeytable.h:131: error: no matching function for call to 'BinarySearch(NEngine::uint32&)'

El compilador de Visual Studio parece que subir la multa jerarquía plantilla, pero gcc me necesita para calificar plenamente en que la función proviene de (He comprobado esto mediante la fijación de los mismos problemas con las variables miembro plantilla de esa manera).

Así que ahora tenemos que cambiar esto en:

return CSimpleTable<CSimpleKey<T> >::BinarySearch<uint32, CSimpleKey<T> >(key);

Lo que ahora produce el siguiente error:

csimplekeytable.h:132: error: expected primary-expression before ',' token
csimplekeytable.h:132: error: expected primary-expression before '>' token

Después de un rascado la cabeza, creo que lo que está pasando aquí es que está tratando de resolver el '<' antes BinarySearch como operador de un 'menor que' por alguna razón.

Así que dos preguntas: - ¿Estoy en el camino correcto con mi interpretación del error? - ¿Cómo lo arreglo

?

-D

¿Fue útil?

Solución

Si CSimpleTable es la clase base, tiene que calificar a su llamada con ese nombre de la clase base o, alternativamente, con this. Pero ya que ambos dependen de los parámetros de plantilla, el compilador no puede buscar lo que significa el nombre de BinarySearch. Podría ser una constante entera estática, lo que se compara contra algo más, o podría ser una plantilla que se pone argumentos encerrados entre <...> para. Usted necesita decirle al compilador acerca de la última

/* the "::template" means: 'the name that follows is a template' */
return CSimpleTable<CSimpleKey<T> >::template BinarySearch<uint32, CSimpleKey<T> >(key);

O con this

return this->template BinarySearch<uint32, CSimpleKey<T> >(key);

La razón de la calificación es que el compilador no busca nombres no calificados en las clases base que dependen de los parámetros de plantilla (en su caso, el parámetro es T), ya que la unión del nombre de dependería de si la clase base tiene tal nombre o no, que se considera desafortunado. Para un nombre de llanura como BinarySearch, existe además ninguna indicación de que este nombre depende de un parámetro de plantilla, por lo tanto la Norma requiere compiladores no retrasar las operaciones de búsqueda del nombre hasta instanciación. Por lo tanto el nombre, incluso si las operaciones de búsqueda en bases de dependientes se permitiría en la instanciación (que no lo es), no se pudo encontrar de todos modos.

Hay que indicar explícitamente al compilador a mirada en la clase que encierra al clasificarse, en cuyo caso el compilador incluirá clases de base dependientes durante la búsqueda cuando instanciar. Prefijar con this o el nombre de la clase también hará que el nombre de depende , retrasando así las operaciones de búsqueda de la misma hasta la instanciación. Se requiere que estos dos hechos para que funcione.

Otros consejos

Tal vez es sólo un problema con el typedef uint32. Podría ser que no está disponible en el nuevo entorno. En el primer caso los picos de resolución de espacio de nombres hasta NEngine :: uint32, en el segundo caso no recoge nada en absoluto (de ahí el error de análisis).

Sugiero buscar cómo uint32 se define en Windows, y tratar de copiar esa definición más.

Tal vez sea porque usted ha hecho sus separaciones inconsistente. Usted ha hecho CSimpleTable<CSimpleKey<T> >, en lugar de CSimpleTable<CSimpleKey<T>>. Creo que ambos deberían ser válidos, pero tal vez hay un error del analizador en cuestión.

Editar:. También puede intentar dirigirse la ruta deducción automática de tipo de argumento, y cortar la especialización explícita

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top