Question

Je suis sur le portage du code de Windows et basé sur un modèle, je suis frappé quelques différences de compilateur sur le SDK iPhone 3.2.

Code d'origine à l'intérieur de la fonction membre d'un modèle de classe est:

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

où BinarySearch est une méthode héritée d'un autre modèle.

Ce produit l'erreur suivante:

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

Le compilateur studio visuel semble marcher la me hiérarchie de modèle bien mais gcc a besoin de se qualifier pleinement où la fonction vient (j'ai vérifié cela en fixant les mêmes problèmes avec les variables membres du modèle que de façon).

Je maintenant besoin de changer cela en:

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

Ce qui produit maintenant l'erreur suivante:

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

Après quelques éraflure de la tête, je crois ce qui se passe ici est qu'il essaie de résoudre le « < » avant BinarySearch comme un opérateur « Moins » pour une raison quelconque.

Alors deux questions:    - Suis-je sur la bonne voie avec mon interprétation de l'erreur?    - Comment puis-je résoudre ce problème

?

-D

Était-ce utile?

La solution

Si CSimpleTable est la classe de base, vous devez qualifier votre appel avec ce nom de classe de base ou encore avec this. Mais puisque ces deux dépendent des paramètres du modèle, le compilateur ne peut pas rechercher ce que les moyens de BinarySearch nom. Il pourrait être une constante entière de statique, que vous comparez contre quelque chose d'autre, ou il pourrait être un modèle que vous mettez des arguments enfermés dans <...> pour. Vous devez dire au compilateur ce dernier

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

Ou avec this

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

La raison de la qualification est que le compilateur ne semble pas pour les noms non qualifiés dans les classes de base qui dépendent des paramètres du modèle (dans votre cas, le paramètre est T), étant donné que la liaison du nom dépendrait de la classe de base a un nom ou pas, ce qui est considéré comme malheureux. Pour un nom simple comme BinarySearch, il est en outre aucune indication que ce nom dépend d'un paramètre de modèle, donc la norme exige compilateurs de ne pas retarder recherche du nom jusqu'à ce que instanciation. Ainsi, le nom, même si recherche dans des bases dépendantes serait autorisée sur instanciation (ce qui est), n'a pas pu être trouvé de toute façon.

Vous devez indiquer explicitement le compilateur de regarder dans la classe de fermeture en le qualifiant, auquel cas le compilateur inclura des classes de base dépendantes lors de la recherche lors de l'instanciation. Préfixant this ou le nom de classe sera également le nom dépendante , ce qui retarde recherche de jusqu'à instanciation. Ces deux faits sont nécessaires pour que cela fonctionne.

Autres conseils

Peut-être juste un problème avec le typedef uint32. Il se pourrait que ce n'est pas disponible dans le nouvel environnement. Dans le premier cas, les choix de résolution d'espace de noms jusqu'à NEngine :: uint32, dans le second cas, il ne capte rien du tout (d'où l'erreur d'analyse syntaxique).

Je suggère à la recherche de la façon dont uint32 est défini sur Windows, et essayez de copier cette définition sur.

Peut-être parce que vous avez fait vos espacements incompatibles. Vous avez fait CSimpleTable<CSimpleKey<T> >, plutôt que CSimpleTable<CSimpleKey<T>>. Je crois qu'ils devraient tous deux être valides, mais peut-être il y a un bug de l'analyseur impliqué.

Modifier. Vous pouvez également essayer de descendre la route de déduction de type d'argument automatique et découper la spécialisation explicite

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top