2012-04-21 14 views
16

Mi rendo conto che domande simili sono state fatte prima, ma ne ho letto un paio e ancora non vedo dove sto andando male. Quando scrivo semplicemente la mia lezione senza separare il prototipo dalla definizione, tutto funziona perfettamente. Il problema si verifica quando separo il prototipo e la definizione come illustrato di seguito:"usato senza parametri modello"

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

E come esempio di una definizione che mi dà questo errore:

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

Non ho mai fatto una classe template prima , quindi scusami se il problema qui è banale.

+0

Nota: nella maggior parte dei casi si desidera che le definizioni delle funzioni membro del modello siano accessibili nell'intestazione. Se le definizioni sono nell'intestazione, ricordati di contrassegnarle come 'inline' (o definirle all'interno della definizione della classe template), se non lo sono, pensaci due volte e assicurati di non aver bisogno delle definizioni nell'intestazione (fai non sono necessarie le definizioni in un'intestazione se si istanzia esplicitamente nell'unità di traduzione che contiene la definizione per * tutti * i tipi con cui si desidera utilizzare il modello). Temo che presto riuscirai ad essere un po '... –

risposta

28

VisitedSet è un modello, non è una classe, quindi non è possibile utilizzare VisitedSet in un nome specificatore annidato come come VisitedSet::getSize(). Così come si è specificato la dichiarazione di class VisitedSet<T> per tutti class T, è necessario specificare la definizione di VisitedSet<T>::getSize() per tutti class T:

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

Il nome di un modello può, tuttavia, essere utilizzato come se fosse una classe all'interno una definizione di modello:

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

In questo caso, è l'abbreviazione di ExampleExample<T>.

0

provare a mettere

template <typename T> 

sopra l'implementazione di VisitedSet :: getSize() - ma attenzione che, in generale, le classi e le funzioni templated dovrebbero essere inline. Vedere il C++ faq here per ulteriori informazioni.

+0

quando metto 'template ' immediatamente sopra la riga con 'int VisitedSet :: getSize() {', ottengo esattamente lo stesso errore. È preferibile che io ** non ** separi il prototipo dalla definizione? È questo che si intende per "inlining" in questo contesto? – synaptik

+0

@synaptic È inoltre necessario utilizzare l'argomento del modello nella classe come me altri hanno suggerito nelle altre risposte. –

3

si desidera che questo:

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

È necessario indicare il parametro di modello nella definizione e

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

altrimenti il ​​compilatore non può corrispondere alla dichiarazione. Ad esempio, potrebbero esserci specializzazioni per alcuni tipi di parametri.

+0

Capisco. Grazie a tutti. – synaptik

2

È necessario lasciare il compilatore sa che si sta implementando un metodo in funzione template:

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