2010-09-20 5 views
2

Je dois utiliser une bibliothèque externe, mais j'obtiens une "erreur de définition multiple" de la fonction de gabarit suivante et de sa spécialisation explicite, si elle est appelée avec une chaîne std :: string.Fonction normale ne pas écraser le modèle

template <typename T> 
void foo(T& value); 

template <> 
void foo(std::string& value); 

même si je change la 2ème fonction

void foo(std::string& value); 

le problème est le même.

Selon [1], la version sans modèle (la "fonction ancienne") devrait être préférée à la version du modèle.

Est-ce que quelqu'un a une idée, où le problème pourrait être?

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

+0

L'erreur est lors de la compilation ou lors de la liaison? De plus, peut-être que le fichier d'en-tête n'est pas bien protégé par les macros à inclure une seule fois. –

+0

Avez-vous uniquement les définitions de fonctions dans votre fichier d'en-tête? Vous avez besoin du corps entier. Voir ici: http://www.parashift.com/c++-faq/templates.html#faq-35.12 – mkb

+0

Merci les gars, la réponse de GMan a fait l'affaire. – randooom

Répondre

3

Vous enfreignez la règle d'une définition.

Sauf si une fonction est inline, elle ne peut être définie qu'une seule fois. Si vous marquez la fonction comme inline, tant que les définitions correspondent, elles peuvent être définies aussi souvent que vous le souhaitez. Les fonctions du modèle se comportent comme si elles étaient implicitement inline, donc vous n'obtenez pas d'erreurs avec les modèles. Cependant, une fonction de spécialisation explicite ou de non-modèle n'est pas implicitement inline et parce que vous l'incluez dans plusieurs unités de traduction, vous obtenez plusieurs définitions; Cela brise la règle. Vous devez le marquer comme inline:

template <> 
inline void foo(std::string& value); 

(Si vous obtenez ce lien avant le temps, vous devez inclure les gardes.)

+0

wohoo ça marche. Merci beaucoup, vous avez sauvé ma journée :) – randooom

+0

Juste pour référence future: $ 14.7.3/14 - "Une spécialisation explicite d'un modèle de fonction est en ligne seulement s'il est explicitement déclaré, et indépendamment du fait que son modèle de fonction soit " Pourriez-vous nous dire s'il vous plaît la référence à propos des «fonctions de template implicitement intégrées»? – Chubsdad

+0

Voulez-vous également changer la 'fonction de modèle' en 'modèle de fonction', et 'spécialisation à spécialisation explicite' dans votre réponse? Avoir déjà + 1 – Chubsdad

Questions connexes