1

我将函数转换为模板,并开始出现此错误。我一定不理解模板的限制。有人能告诉我为什么这会坏吗?

我收到此错误:

Undefined symbols:
  "bool foo<int>(int const&, int const&)", referenced from:
      _main in file1.o
ld: symbol(s) not found

当我链接以下代码时。代码已简化,但仍然失败。第一个文件包含:

#include <iostream>
template <class T> bool foo (const T&, const T&);

int main ()
{
  int left = 1;
  int right = 2;

  if (foo <int> (left, right))
    std::cout << "foo!" << std::endl;

  return 0;
}

第二个文件包含:

template <class T> bool foo (const T& left, const T& right)
{
  return true;
}
4

2 回答 2

3

由于 Uri 给出的原因,模板方法通常在头文件中定义。因为你的是一个函数而不是一个类的方法,所以将它显式定义为静态或内联(在头文件中可能包含在多个 CPP 文件中)。

把它放在你的 foo.h

template<class T> inline bool foo (const T& left, const T& right)
{
  return true;
}

把它放在你的 main.cpp

#include <iostream>
#include "foo.h"

int main ()
{
  int left = 1;
  int right = 2;

  if (foo <int> (left, right))
    std::cout << "foo!" << std::endl;

  return 0;
}

cpp 代码现在可以看到模板函数的整个声明。

此处列出了其他解决方案:如何避免模板函数出现链接器错误?

于 2009-02-15T02:59:49.367 回答
2

自从我做了很多 C++ 以来已经有好几年了,但我认为你遇到了单独编译的问题。模板在编译时实例化,而不是链接。

因此,当您调用 foo() 时,您并没有真正实例化模板,因为没有生成新的函数代码,您只是创建了一个链接器必须解析的符号。

然而,当第二个文件被编译时,它只有模板并且它从未被实例化,因此没有生成实际处理 int 的 foo() 版本。结果,当您将所有内容链接在一起时,您会收到错误消息。

我不是 100% 确定该怎么做,但我怀疑你需要在第二个文件中强制实例化 foo() 和整数(假设它是 C++)。我只使用类模板,而不是函数模板,我相信这里有人会给你一些确切的代码......

于 2009-02-15T02:55:45.133 回答