我转换函数为模板,并开始收到这个错误。我不能了解的模板的限制。谁能告诉我这是为什么坏了?

我收到此错误:

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;
}
有帮助吗?

解决方案

有关乌里给出的原因,模板的方法通常在头文件中定义。因为你是一个函数,而不是一类的方法,明确地定义它(在其可被一个以上的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代码现在看到的模板函数的整个声明。

其他的解决方案在这里列出:我怎样才能避免连接器我的模板函数的错误?

其他提示

这已经多年,因为我做了很多C ++,但我认为你遇到不同的编译的问题。模板在编译实例化,而不是连接。

因此,当你正在调用到foo(),你是不是真的在实例化,没有新的功能代码生成,你只是创建符号链接器必须解决意义上的模板。

然而,当第二个文件被编译,它只是模板,这是从来没有实例化,所以不会产生版本的foo()的实际与整数交易。其结果是,当你链接在一起的一切,你的错误。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top