2016-01-15 15 views
5

Sto cercando di imparare modelli in C++ e ho il seguente codice:modello e definizione della classe derivata: errore: 'myClass' non è una classe, spazio dei nomi, o enumerazione

#include <stack> 

template<typename T> 
class myClass : public std::stack<T>{ 
public: 
    myClass(void); 
    myClass(myClass const & src); 
    virtual ~myClass(void); 
    myClass & operator=(myClass const & rhs); 
}; 

template<typename T> 
myClass::myClass(void) : std::stack<T>(){ 
} 

ma posso' t capire perché ricevo il seguente quando provo a compilare:

test.cpp:17:1: error: 'myClass' is not a class, namespace, or enumeration 
myClass::myClass(void) : std::stack<T>(){ 
^ 
test.cpp:8:9: note: 'myClass' declared here 
class myClass : public std::stack<T>{ 
     ^
1 error generated. 

sembra la definizione della funzione causa l'errore, ma io non so perché ottengo questo errore, sembra OK per me (anche se immagino che non sia proprio OK), forse solo un errore di sintassi? ..

Compilare con clang ++ -Wall -Werror -Wextra -c.

Cosa potrebbe causare questo errore?

+2

Nota a margine: non è necessario specificare 'void' se una funzione non ha parametri, basta usare' myClass(); '. – user657267

+1

@ user657267 È vero, in effetti, ma devo usarlo nella mia scuola per programmare la ragione di stile (chiesto dalla mia scuola, ho preso l'abitudine). – vmonteco

risposta

8

È necessario specificare il parametro del modello per questo, poiché myClass è una classe modello.

template<typename T> 
myClass<T>::myClass(void) : std::stack<T>() { 
//  ~~~ 
} 

BTW: : std::stack<T>() sembra essere ridondante.

LIVE

+0

Proprio così! grazie mille, è stata una domanda stupida forse, mia cattiva! È perché il compilatore ha bisogno di questo parametro per "instanciare" la classe prima di definire le sue funzioni membro? (Potrei sbagliarti però, sto semplicemente cercando di capire lo scopo di questo) – vmonteco

+0

@vmonteco Io non la penso così. Penso che il compilatore pensi che 'myClass' dovrebbe essere seguito da' <> ', perché è un modello. Detto diversamente, il compilatore non può trovare una classe non template chiamata 'myClass'. – songyuanyao

+0

@songyuanyo Ho appena scoperto che è necessario anche se lo passo come parametro, quindi immagino che sia una parte della definizione della classe come un tipo? (Forse è qualcosa tipo ** myClass ** -> modello e ** myClass ** -> classe creata con il modello?), (BTW, cosa intendi con "std :: stack ()" è ridondante, Potrei fare a meno in questo caso? – vmonteco