considerando sempre che la seguente intestazione, contenente la mia classe su modelli, è inclusa in almeno due .CPP
file, il codice compilato correttamente:modello di specializzazione di un unico metodo da una classe template
template <class T>
class TClass
{
public:
void doSomething(std::vector<T> * v);
};
template <class T>
void TClass<T>::doSomething(std::vector<T> * v) {
// Do somtehing with a vector of a generic T
}
template <>
inline void TClass<int>::doSomething(std::vector<int> * v) {
// Do somtehing with a vector of int's
}
Ma notare che la linea nel metodo di specializzazione. È necessario che il codice non abbia errore di linker (in VS2008 è LNK2005) a causa del metodo che viene definito più di una volta. Capisco questo perché AFAIK una specializzazione di modello completo è la stessa di una semplice definizione di metodo.
Quindi, come rimuovere quello inline
? Il codice non dovrebbe essere duplicato in ogni suo utilizzo. Ho cercato su Google, ho letto alcune domande qui in SO e ho provato molte delle soluzioni suggerite, ma nessuna è stata realizzata correttamente (almeno non in VS 2008).
Grazie!
Perché vuoi rimuovere la linea? Lo trovi esteticamente sgradevole? Pensi che cambi il significato del tuo codice? –
Perché se questo metodo fosse "long" e usato in molti posti, dovrei copiare il suo codice binario ovunque, giusto? Ho cercato di spiegarlo nella domanda, ma suppongo che non fosse chiaro ... :) – Chuim
@ Martin: Che cosa succede se l'implementazione richiede molto altro codice che deve quindi essere incluso da questa intestazione invece del file cpp? – sbi