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.
* 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