2010-04-23 83 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