2014-09-08 15 views
6

Ho solo un file hpp per un compito scolastico in C++ (non sono autorizzato ad aggiungere un file cpp, la dichiarazione e l'implementazione dovrebbero essere entrambe scritte nel file).classe template con un singolo metodo specializzato in C++

ho scritto questo codice al suo interno:

template<class T> 
class Matrix 
{ 
    void foo() 
    { 
     //do something for a T variable. 
    } 
}; 

vorrei aggiungere un altro metodo foo, ma questo foo() saranno specializzati per un solo <int>. Ho letto in alcuni punti che ho bisogno di dichiarare una nuova classe di specializzazione perché funzioni. Ma quello che voglio è che la specializzazione foo si trovano appena sotto l'originale foo, in modo che sarà simile a questa:

template<class T> 
class Matrix 
{ 
    void foo(T x) 
    { 
     //do something for a T variable. 
    } 
    template<> void foo<int>(int x) 
    { 
     //do something for an int variable. 
    } 
}; 
  • Perché mi appare un errore per questa sintassi ("atteso non qualificata-id, prima ' < "token")?
  • Perché non è possibile?
  • Come posso risolvere questo problema senza dichiarare una nuova classe specializzata?

Grazie

+0

'foo' non è un modello. 'Matrix' è. –

+0

Si riceve l'errore perché viola la sintassi C++. Non è possibile specializzare solo un membro di una classe modello, ma è necessario specializzarsi per l'intera classe. – 101010

+0

Ma ho molte altre funzioni in quella classe, quindi devo copiare e incollare tutte queste funzioni nella nuova classe "int"? sembra una terribile ripetizione del codice. – user2630165

risposta

10

foo non è un modello. È una funzione membro di un modello. Pertanto, foo<int> non ha senso. (Inoltre, specializzazioni esplicite devono essere dichiarati in ambito namespace.)

è possibile specializzarsi in modo esplicito una funzione di membro di un particolare di un'istanza implicita di un modello di classe:

template<class T> 
class Matrix 
{ 
    void foo(T x) 
    { 
     //do something for a T variable. 
    } 
}; 

// must mark this inline to avoid ODR violations 
// when it's defined in a header 
template<> inline void Matrix<int>::foo(int x) 
{ 
    //do something for an int variable. 
} 
+0

Fantastico. ma è permesso scrivere questa riga: template <> void Matrix :: foo (int x) all'interno di un file hpp? perché di solito lo vedo solo nei file cpp. – user2630165

+0

@ user2630165 Sì, va bene ... però dovrai renderlo 'inline'. –

0

è necessario definire il metodo foo originale un modello, e in realtà non v'è alcuna necessità per la classe di essere un modello, solo il metodo:

class Matrix 
{ 
    template<typename T> void foo(T x) 
    { 
     //do something for a T variable. 
    } 
    template<> void foo<int>(int x) 
    { 
     //do something for an int variable. 
    } 
}; 

UPDATE: il codice funziona solo in Visual Studio. Ecco un codice che dovrebbe funzionare anche altrove:

class Matrix 
{ 
    template<typename T> void foo(T x) 
    { 
     //do something for a T variable. 
    } 
}; 

template<> void Matrix::foo<int>(int x) 
{ 
    //do something for an int variable. 
} 
+1

Non compila: 'errore: specializzazione esplicita in ambito non-namespace 'classe Matrix'' ... – Jarod42

+0

Esatto, il codice che ho scritto è compatibile solo con Visual Studio. Ho aggiunto un codice compatibile con C++ che dovrebbe funzionare anche con GCC. – Adam

+1

Sono abbastanza sicuro che OP abbia bisogno di 'Matrix' per essere un modello. – jrok

Problemi correlati