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?

[1] http://www.gotw.ca/publications/mill17.htm

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top