Mon code complet est trop long, mais voici un extrait qui reflétera l'essence de mon problème: Lorsque je compile ce code, je reçois les erreurs suivantes: P > In file included from BPCFGParser.cpp:3,
from experiments.cpp:2:
BPCFGParser.h:225: error: expected unqualified-id before ânamespaceâ
experiments.cpp:7: error: expected `}' at end of input
BPCFGParser.h:222: error: expected unqualified-id at end of input
6 Réponses :
Vous devez déplacer la spécialisation en une classe intérieure à l'intérieur de BPCFGPARSER. Cela répond aux deux exigences
activequivclass code> li>
- avant l'utilisation de la spécialisation li>
ol>
Exemple: P>
class BPCFGParser {
class ActiveEquivClass {
...
};
template <>
class hash<ActiveEquivClass> {
public:
size_t operator()(const BPCFGParser::ActiveEquivClass & aec) const {
}
};
...
unordered_map<ActiveEquivClass, Edge *, hash<ActiveEquivClass>, EqActiveEquivClass> discovered_active_edges;
};
Merci beaucoup pour la réponse, mais cela ne fonctionne pas. Voir ci-dessous pour l'explication.
Essayez de déplacer le code de spécialisation de Hash <> Modèle avant la déclaration de classe BPCFGPARSER. L'erreur signifie que Hash est développé en fonction de STD :: Hash défini à /usr/included/c++/4.3/tr1_impl/funconal_hash.h; Donc, votre spécialisation n'est donc pas utilisée avant l'instanciation. Idéalement, votre code de spécialisation doit être mis à la disposition du compilateur avant l'élargissement du modèle. P>
Chaque fois que vous utilisez une classe comme paramètre de modèle, la Déclaration de Cette classe doit être complète et non simplement avancée déclarée. P>
Ceci n'est pas réellement vrai. Les limites des paramètres de modèle doivent être des types complets dépendent généralement du contenu de la gabarit; mais il n'est pas illégal d'instancier un modèle avec un type incomplet tant que le modèle ne contient pas de code illégal avec un type incomplet. P>
Le seul moyen d'aborder votre problème consiste à définir le Spécialisation EM> Avant la classe, mais pour définir la fonction de membre réelle
opérateur () code> après em> la classe. C'est-à-dire p>
xxx pré> Cela signifie également, aucune classe imbriquée, comme vous ne pouvez pas transmettre déclarer une classe imbriquée. P> blockQquote>
J'ai exactement le même problème et j'ai enfin proposé une solution de fonctionnement hachaud définie par l'utilisateur de Solution, voir ci-dessous: Et je suis stille, je me demande s'il y a une STD :: approche de spécialisation de hachage. Quelqu'un peut-il comprendre? P> p>
Je sais que cette question est assez ancienne, mais je viens de rencontrer le même problème et je pensais signaler mes conclusions.
Le message d'erreur: P>
In file included from BPCFGParser.cpp:3, from experiments.cpp:2: BPCFGParser.h:408: error: specialization of âstd::hash<BPCFGParser::ActiveEquivClass>â after instantiation BPCFGParser.h:408: error: redefinition of âclass std::hash<BPCFGParser::ActiveEquivClass>â /usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of âclass std::hash<BPCFGParser::ActiveEquivClass>â BPCFGParser.h:445: error: specialization of âstd::hash<BPCFGParser::PassiveEquivClass>â after instantiation BPCFGParser.h:445: error: redefinition of âclass std::hash<BPCFGParser::PassiveEquivClass>â /usr/include/c++/4.3/tr1_impl/functional_hash.h:44: error: previous definition of âclass std::hash<BPCFGParser::PassiveEquivClass>â
Qu'en est-il de définir les classes de membres dans un espace de noms de certains espaces de noms?