2010-11-02 21 views
12

J'essaie de trouver des informations sur le mot-clé modèle utilisé comme désambiguïsant, mais il n'y a rien à ce sujet. Probablement je suis à la recherche de mauvais mots-clés, mais il n'y a rien de tel que .template ou -> template en standard. Google montre seulement les problèmes de GCC de différents forums, mais pas vraiment d'explication à quoi il sert.modèle disambiguator

Le code comme celui-ci n'a pas pu être compilé sans le mot-clé template sur la ligne 11 (sur GCC), mais je ne suis pas sûr que cela soit conforme à la norme.

template<typename B> 
struct S1 
{ 
    template<typename T> void test() {} 
}; 

template<typename T> 
struct S2 
{ 
    S2() 
    { 
     S1<T>().template test<int>(); 
    } 
}; 

int main() 
{ 
    S2<int>(); 
} 

Donc ma question est: pourquoi mot-clé modèle utilisé ici, quel genre d'ambiguïté est là sans ce mot-clé et où puis-je lire à ce sujet (j'apprécierais vraiment lien à la norme).

Merci.

+0

@Prasoon: Je sais là où beaucoup de questions où l'utilisation du mot-clé 'template' était la réponse, mais je ne trouve pas de question la demandant directement. –

+0

@ Space_C0wb0y: Désolé, j'ai supprimé mon commentaire précédent. –

+0

Vous pouvez également lire ceci: http://stackoverflow.com/questions/3786360/confusing-template-error/3786726#3786726 –

Répondre

8

Réponse courte: Comme la norme le dit

ISO C++ 03 14.2/4

Lorsque le nom d'une spécialisation de modèle de membre apparaît après. ou -> dans une expression postfixe, ou après un spécificateur de nom imbriqué dans un ID qualifié, et l'expression postfixe ou l'ID qualifié dépend explicitement d'un paramètre de modèle (14.6.2), le nom du modèle de membre doit être préfixé par le modèle de mot-clé. Sinon, le nom est supposé nommer un non-modèle.

P.S:

Sans cette utilisation supplémentaire de modèle, le compilateur ne sait pas que le moins de jetons (<) qui suit est pas vraiment « moins », mais le début d'une liste d'arguments de modèle.

+4

Probablement j'ai besoin de changer mon logiciel de lecture PDF :) juste après ce texte il y a un exemple en utilisant -> template, que mon logiciel n'a pas réussi à trouver. Merci beaucoup. C'est ça. – confucius