2010-03-21 6 views
3

j'ai une classe de modèle comme ici (en-tête) d'une classe interne et un élément statique de type pointeur de classe interneC++ définissant un élément statique d'une classe de modèle avec le pointeur de type classe interne

template <class t> class outer { 
    class inner { 
     int a; 
    }; 

    static inner *m; 
}; 

template <class t> outer <t>::inner *outer <t>::m; 

quand je veux définir ce membre statique je dis "erreur: constructeur attendu, destructeur, ou conversion de type avant" * "jeton" sur la dernière ligne (mingw32-g ++ 3.4.5)

+0

Votre utilisation des espaces rend la dernière ligne incroyable difficile à lire correctement. J'ai dû réfléchir très fort un moment pour comprendre sa signification. Fondamentalement, vous avez déchiré des choses qui appartiennent ensemble (nom de fichier, arguments de modèle, qualificateur de pointeur) et collé des choses qui ne sont pas ensemble (pointeur-qualificateur, nom de variable). –

Répondre

4

Vous devez qualifier le inner class est un typename, car il dépend d'un paramètre de modèle et le compilateur C++ suppose que le nom inner dans ce contexte est pas un type:

template <class t> typename outer<t>::inner* outer<t>::m; 

Justification: le nom inner dans la ligne ci-dessus dépend d'un nom de type, t. Le compilateur C++ à ce stade ne sait pas ce que inner est, car la signification du nom inner peut différer selon t. Par exemple, supposons que, quelque part ailleurs dans le code, il existe une version spécialisée de la classe outer pour int:

template <> 
class outer<int> { 
    int inner; 
}; 

Maintenant, outer<int>::inner noms ne sont plus un type; il nomme une variable membre.

Ainsi, dans le cas général, le sens de outer<t>::inner serait ambigu et C++ résout cette ambiguïté en supposant que inner ne fait pas nom d'un type. Sauf si vous le dites, en le préfixant avec typename: typename outer<t>::inner. (Dans ce contexte, inner est appelé nom dépendant car il dépend du type exact de t.)