web-dev-qa-db-fra.com

"utilisé sans paramètres de modèle"

Je sais que des questions similaires ont déjà été posées, mais j'en ai lu quelques-unes et je ne vois toujours pas où je me trompe. Quand j'écris simplement ma classe sans séparer le prototype de la définition, tout fonctionne bien. Le problème se produit lorsque je sépare le prototype et la définition comme indiqué ci-dessous:

template<class T> class VisitedSet { 
public:
    VisitedSet(); 
    int getSize(); 
    void addSolution(const T& soln); 
    void evaluate(); 
private:
    vector<T> vec;
    int iteration;
};

Et à titre d'exemple d'une définition qui me donne cette erreur:

int VisitedSet::getSize() {
    return vec.size();

Je n'ai jamais fait de cours basé sur un modèle auparavant, alors veuillez me pardonner si le problème ici est trivial.

21
synaptik

VisitedSet est un modèle et non une classe. Vous ne pouvez donc pas utiliser VisitedSet dans un spécificateur de nom imbriqué tel que VisitedSet::getSize(). Tout comme vous avez spécifié la déclaration de class VisitedSet<T> pour tout class T, vous devez spécifier la définition de VisitedSet<T>::getSize() pour tout class T:

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

Le nom d'un modèle peut cependant être utilisé comme s'il s'agissait d'une classe dans une définition de modèle:

template<class T>
struct Example {
    Example* parent;
    T x, y;
};

Dans ce cas, Example est l'abréviation de Example<T>.

34
Jon Purdy

Tu veux ça:

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

Vous devez également indiquer le paramètre template dans la définition.

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

sinon, le compilateur ne peut pas le faire correspondre à la déclaration. Par exemple, il peut exister des spécialisations pour certains types de paramètres.

2
Bo Persson

Vous devez informer votre compilateur que vous implémentez une méthode dans la fonction template:

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

Essayez de mettre 

template <typename T>

au-dessus de l'implémentation de VisitedSet :: getSize () - mais sachez qu'en général, les classes et les fonctions basées sur des modèles devraient toutes être en ligne. Voir la FAQ c ++ ici pour plus d’informations.

0
ds1848