2017-09-29 5 views
0

D'une certaine façon, je ne suis pas en mesure de comprendre cela answer.Pourquoi la notation abrégée ne fonctionne-t-elle pas en dehors de la classe?

Lorsqu'une fonction de membre est définie en dehors des cours, pourquoi ne pouvons-nous avoir simple spécificateur nom imbriqué (par exemple Foo::Foo(){} au lieu d'avoir un plus bavardFoo<T>::Foo(){}), même après la déclaration de modèle est répété juste avant le membre définition de la fonction.

+2

* La classification de type * est un abus de langage. C'est un modèle de classe, ce qui signifie que c'est un modèle pour créer une classe, ce n'est pas une classe elle-même. – NathanOliver

Répondre

1

La subtilité est que dans

template<class T> 
int VisitedSet::getSize() { 
    return vec.size(); 
} 

le compilateur C++ ne sais pas encore ce que T applique. Lorsque vous travaillez dans la définition de classe pour VisitedSet, vous pouvez utiliser VisitedSet::... sans ambiguïté, mais en dehors de la ne fonctionne pas. Lorsque vous êtes en dehors de la définition de classe, la syntaxe requiert que vous indiquiez au compilateur les paramètres du modèle utilisant la syntaxe tempate<class T>, puis que vous indiquiez au compilateur où ils s'appliquent.

Dans ce cas, qui peut sembler ambigu, mais considérer le cas imbriqué suivant:

template<class T> 
class Foo { 
    template<class R> 
    class Bar { 
     int getSize(); 
    }; 
}; 

Ensuite, il est plus évident pourquoi vous avez besoin d'être précis:

template<class X, class Y> 
int Foo<Y>::Bar<X>::getSize() { ... 

et

template<class A, class B> 
int Foo<A>::Bar<B>::getSize() { ... 

sont tous les deux valides.

Voilà pourquoi vous avez besoin

template<class T> 
int VisitedSet<T>::getSize() { 
    return vec.size(); 
} 

même dans le cas le plus simple indiqué dans la réponse que vous lien.