我收到以下错误:
features.cpp:(.text+0x4f6): undefined reference to `void Convolve<float>(CImageOf<float>, CImageOf<float>&, CImageOf<float>)'
因此,在我的features.cpp文件中,我添加了以下头文件,内容为:
template <class T>
void Convolve(CImageOf<T> src, CImageOf<T>& dst,
CFloatImage kernel);
我正在使用ubuntu 64bit上的GCC进行编译。我意识到上面的错误是因为我的标题中的内容与引用不匹配,但这是因为模板,所以我不应该有这个问题吗?还有什么事呢?
我仔细检查了我的卷积调用,实际上这是我正在使用的类型:
Convolve(CFloatImage, CFloatImage, CFloatImage);
我实际上找不到任何对上述错误的引用
答案 0 :(得分:4)
如果将函数模板放入.cpp文件并在不同的转换单元中使用它,则需要显式实例化模板,例如:
template
void Convolve<float>(
CImageOf<float> src,
CImageOf<float>& dst,
CFloatImage kernel);
基本上,编译器只有在看到它的定义时才能实例化templte。如果您希望自动实例化模板,则需要在标题中定义它。
答案 1 :(得分:0)
正如在带有OP的chat中所发现的那样,问题可能出在没有正确链接的Makefile中。
.h文件中没有定义,只有模板的声明(正如你们有人建议的那样)。我认为OP混淆了条款。
然而,.cpp文件中的模板定义以及实例化Convolve<float>
(和其他)的(非模板)函数定义。
重复一遍:代码是正确的,但构建例程不是。