我将一个函数转换为一个模板,并开始得到这个错误。我不能理解模板的限制。有人能告诉我为什么这个坏了吗?
我收到此错误:
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;
}发布于 2009-02-15 02:59:49
由于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代码现在可以看到模板函数的整个声明。
此处列出了其他解决方案:How can I avoid linker errors with my template functions?
发布于 2009-02-15 02:55:45
我已经多年没有做过很多C++了,但我认为您遇到了单独编译的问题。模板在编译时实例化,而不是在链接时实例化。
因此,当您调用foo()时,您实际上并不是在实例化模板,因为没有生成新的函数代码,您只是创建了一个链接器必须解析的符号。
但是,在编译第二个文件时,它只有一个模板,并且从未实例化过,因此不会生成实际处理int的foo()版本。因此,当您将所有内容链接在一起时,您会得到错误。
我不是100%确定该怎么做,但我怀疑您需要在第二个文件中使用it强制实例化foo() (假设它是一个C++)。我只使用类模板,而不是函数模板,我相信这里有人会在几分钟内给你确切的代码……
https://stackoverflow.com/questions/550219
复制相似问题