2010-04-23 131 views
1

我試圖重載一個「顯示器」的方法如下:功能模板重載:鏈接錯誤

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

我打電話,然後用無符號字符* IM1與char * IM2模板:

imShow(im1, im2, ImgW, ImgH); 

編譯沒有問題,但我得到一個鏈接錯誤「解析的外部符號」爲:

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

我不明白我做錯了什麼!

回答

1

您可能忘了定義您的模板功能正常。定義在哪裏?我的帖子中沒有看到任何內容。

+0

我需要正確定義方法*!我將它定義爲imShow而不是MyClass :: imShow ...謝謝!對不起,初學者錯誤... – matt 2010-04-23 14:42:52

2

如果你的編譯器沒有「導出」模板功能(只有基於EDG前端的編譯器有,GCC和MSVC沒有),你需要在頭文件中定義該模板。您也可以顯式實例在.cpp文件中的函數模板(如果你放在那裏的定義):

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

但只要你通過另一對類型還沒有明確的實例那樣,再次無法鏈接。因此,您需要將函數模板的定義放入頭中,以便編譯器在調用函數時看到它,並實例化函數本身的副本。

+0

我在.cpp文件中定義了模板(沒有實例化它),它正在工作..我使用的是Visual Studio 2008,這是否意味着它具有「導出」模板功能? – matt 2010-04-23 14:48:41

+0

@matt與「.cpp」文件我的意思是你編譯你的模板分開使用它的代碼。如果您在使用它的翻譯單元中執行'#include「file.cpp」',那就不同了。如果單獨編譯,您將獲得鏈接器錯誤。 – 2010-04-23 15:11:43

+0

哦,好吧,它現在是完美的意義!定義函數的.cpp文件是我需要的唯一地方,但如果我需要它,我會意識到這一點!謝謝 – matt 2010-04-23 15:34:49