首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用模板时出现链接错误

使用模板时出现链接错误
EN

Stack Overflow用户
提问于 2009-02-15 02:48:17
回答 2查看 1.4K关注 0票数 1

我将一个函数转换为一个模板,并开始得到这个错误。我不能理解模板的限制。有人能告诉我为什么这个坏了吗?

我收到此错误:

代码语言:javascript
复制
Undefined symbols:
  "bool foo<int>(int const&, int const&)", referenced from:
      _main in file1.o
ld: symbol(s) not found

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

代码语言:javascript
复制
#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;
}

第二个文件包含:

代码语言:javascript
复制
template <class T> bool foo (const T& left, const T& right)
{
  return true;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-15 02:59:49

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

把这个放到你的foo.h

代码语言:javascript
复制
template<class T> inline bool foo (const T& left, const T& right)
{
  return true;
}

将此放入您的main.cpp

代码语言:javascript
复制
#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?

票数 3
EN

Stack Overflow用户

发布于 2009-02-15 02:55:45

我已经多年没有做过很多C++了,但我认为您遇到了单独编译的问题。模板在编译时实例化,而不是在链接时实例化。

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

但是,在编译第二个文件时,它只有一个模板,并且从未实例化过,因此不会生成实际处理int的foo()版本。因此,当您将所有内容链接在一起时,您会得到错误。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/550219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档