la funzione normale non sovrascrivere funzione template
-
04-10-2019 - |
Domanda
devo usare una libreria esterna, ma sto ottenendo "un errore multipla definizione" dalla seguente funzione di modello e la sua specializzazione esplicita, se viene chiamato con uno std :: string.
template <typename T>
void foo(T& value);
template <>
void foo(std::string& value);
, anche se cambio la seconda funzione per
void foo(std::string& value);
il problema è lo stesso.
Secondo [1] almeno la versione senza un modello (la "vecchia funzione plain") dovrebbe essere preferivamo rispetto alla versione del modello.
Qualcuno ha un indizio, dove il problema potrebbe essere?
Soluzione
Si sta rompendo la regola una definizione.
A meno che una funzione è inline
, può essere definito solo una volta. Se si seleziona la funzione di inline
, a condizione che le definizioni corrispondono possono essere definiti con la frequenza desiderata. Funzioni per i template si comportano come se fossero implicitamente inline
, in modo da non ottiene gli errori con i modelli.
Tuttavia, una specializzazione esplicita o una funzione non-modello non è implicitamente inline
e perché si sta includendolo in più unità di traduzione, si ottiene più definizioni; questo rompe la regola. Si dovrebbe contrassegnare come inline
:
template <>
inline void foo(std::string& value);
(Se stai ricevendo questo prima fase di collegamento, si è fatto obbligo di guardie.)