9
votes

Spécialisation du modèle après l'instanciation?

Mon code complet est trop long, mais voici un extrait qui reflétera l'essence de mon problème: xxx pré>

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


0 commentaires

6 Réponses :


7
votes

Vous devez déplacer la spécialisation en une classe intérieure à l'intérieur de BPCFGPARSER. Cela répond aux deux exigences

  1. La spécialisation est après la définition complète de activequivclass code> li>
  2. 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;
    
    };
    


1 commentaires

Merci beaucoup pour la réponse, mais cela ne fonctionne pas. Voir ci-dessous pour l'explication.



1
votes

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.


0 commentaires

0
votes

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.

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.

Le seul moyen d'aborder votre problème consiste à définir le Spécialisation Avant la classe, mais pour définir la fonction de membre réelle opérateur () après la classe. C'est-à-dire xxx

Cela signifie également, aucune classe imbriquée, comme vous ne pouvez pas transmettre déclarer une classe imbriquée.


0 commentaires

0
votes

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: XXX

Et je suis stille, je me demande s'il y a une STD :: approche de spécialisation de hachage. Quelqu'un peut-il comprendre?


0 commentaires

2
votes

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>’


0 commentaires

0
votes

Qu'en est-il de définir les classes de membres dans un espace de noms de certains espaces de noms? XXX


0 commentaires