2010-04-23 13 views
1

Je suis en train de surcharger une méthode "d'affichage" comme suit:Fonction surcharge modèle: lien erreur

template <typename T> void imShow(T* img, int ImgW, int ImgH); 
template <typename T1, typename T2> void imShow(T1* img1, T2* img2, int ImgW, int ImgH); 

J'appelle alors le modèle avec unsigned char * IM1 et char * IM2:

imShow(im1, im2, ImgW, ImgH); 

Cette compile très bien, mais je reçois une erreur de lien « symbole externe non résolu » pour:

imShow<unsigned char,char>(unsigned char *,char *,int,int) 

Je ne comprends pas ce que je fait de mal!

Répondre

1

Vous avez probablement oublié de définir votre fonction de modèle correctement. Où sont les définitions? Je n'en vois pas dans votre post.

+0

J'avais besoin de définir la méthode * correctement *! Je l'ai défini comme imShow au lieu de MyClass :: imShow ... merci! Désolé, erreur débutant ... – matt

2

Vous devez définir ce modèle dans le fichier d'en-tête si votre compilateur n'a pas la fonction de modèle "export" (seuls les compilateurs basés sur le frontend EDG ont, ce que GCC et MSVC ne font pas). Alternativement, vous pouvez instancier explicitement le modèle de fonction dans le fichier .cpp (si vous avez placé sa définition là-bas):

template void imShow(unsigned char* img1, char* img2, int ImgW, int ImgH); 

Mais dès que vous passez une autre paire de types que vous n'avez pas explicitement instancié comme ça, encore ne parvient pas à lier. Vous devez donc placer la définition du modèle de fonction dans l'en-tête, de sorte que le compilateur la voit lors de l'appel de la fonction et instancie une copie de la fonction elle-même.

+0

J'ai défini le modèle (sans l'instancier) dans le fichier .cpp et cela fonctionne .. J'utilise Visual Studio 2008, cela signifie-t-il qu'il a la fonction de modèle "export"? – matt

+0

@matt avec le fichier ".cpp" Je voulais dire que vous compilez votre template séparé du code qui l'utilise. Si vous faites '#include" file.cpp "' dans l'unité de traduction qui l'utilise, c'est différent. Si vous compilez séparément, vous obtiendrez des erreurs d'éditeur de liens. –

+0

Oh ok c'est tout à fait logique maintenant! Le fichier .cpp où la fonction est définie est le seul endroit où j'en ai besoin, mais je le saurai si j'en ai besoin ailleurs! Merci – matt