未定义引用void“function”C ++

时间:2012-09-22 18:10:48

标签: c++ reference header

我收到以下错误:

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

我实际上找不到任何对上述错误的引用

2 个答案:

答案 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>(和其他)的(非模板)函数定义。

重复一遍:代码是正确的,但构建例程不是。