【问题标题】:Function template overloading: link error函数模板重载:链接错误
【发布时间】:2010-04-23 14:28:52
【问题描述】:

我正在尝试重载“显示”方法,如下所示:

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

然后我用 unsigned char* im1 和 char* im2 调用模板:

imShow(im1, im2, ImgW, ImgH);

这编译得很好,但我得到一个链接错误“未解析的外部符号”:

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

我不明白我做错了什么!

【问题讨论】:

    标签: c++ templates overloading function-templates


    【解决方案1】:

    如果您的编译器没有“导出”模板功能(只有基于 EDG 前端的编译器有,GCC 和 MSVC 没有),您需要在头文件中定义该模板。您也可以在 .cpp 文件中显式实例化函数模板(如果您将其定义放在那里):

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

    但是,一旦您传递了另一对未像那样显式实例化的类型,它就会再次无法链接。所以你需要把函数模板的定义放在头文件中,这样编译器在调用函数时就可以看到它,并实例化函数本身的副本。

    【讨论】:

    • 我在 .cpp 文件中定义了模板(没有实例化它)并且它正在工作。我使用的是 Visual Studio 2008,这是否意味着它具有“导出”模板功能?跨度>
    • @matt with ".cpp" file 我的意思是你编译你的模板与使用它的代码分开。如果您在使用它的翻译单元中使用#include "file.cpp",那就不同了。如果您单独编译,您将获得链接器错误。
    • 哦,好吧,现在很有意义!定义函数的 .cpp 文件是我唯一需要它的地方,但如果我在其他任何地方需要它,我会注意到这一点!谢谢
    【解决方案2】:

    您可能忘记正确定义您的模板函数。定义在哪里?我在您的帖子中没有看到任何内容。

    【讨论】:

    • 我需要正确地定义方法!我将其定义为 imShow 而不是 MyClass::imShow ...谢谢!对不起,初学者的错误......
    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2021-06-10
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多