0

我收到以下错误:

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

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

4

2 回答 2

4

如果将函数模板放入 .cpp 文件并在不同的翻译单元中使用它,则需要显式实例化模板,例如:

template
void Convolve<float>(
   CImageOf<float> src,
   CImageOf<float>& dst,
   CFloatImage kernel);

基本上,编译器只有在看到模板定义后才能实例化模板。如果您希望模板自动实例化,则需要在标题中定义它。

于 2012-09-22T18:16:36.537 回答
0

在与 OP 的聊天中发现,问题可能出在未正确链接的 Makefile 中。

.h 文件中没有定义,只有一个模板声明(正如你们中的一些人所建议的那样)。我认为OP混淆了这些条款。

但是,.cpp 文件中有一个模板定义以及一个实例化Convolve<float>(和其他)的(非模板)函数定义。

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

于 2012-09-23T09:06:39.633 回答