对无效"function" C++的未定义引用

undefined reference to void "function" C++

本文关键字:未定义 引用 function 无效 C++      更新时间:2023-10-16

我收到以下错误:

features.cpp:(.text+0x4f6): undefined reference to `void Convolve<float>(CImageOf<float>, CImageOf<float>&, CImageOf<float>)'

因此,在我的功能.cpp文件中,我添加了以下头文件,其中包含以下内容:

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

我正在 ubuntu 64 位上使用 GCC 编译它。我意识到上面的错误是因为我的标题中的内容与引用不匹配,但那是因为模板,所以我不应该遇到这个问题吧?还发生了什么事?

我仔细检查了我的调用以卷积,实际上这是我正在使用的类型:

Convolve(CFloatImage, CFloatImage, CFloatImage); 

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

如果将

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

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

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

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

没有定义,而是在 .h 文件中声明模板(正如你们中的一些人所建议的那样)。我认为OP混淆了术语。

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

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