【问题标题】:Undefined symbols for architecture x86_64 error架构 x86_64 错误的未定义符号
【发布时间】:2012-04-21 22:48:14
【问题描述】:

我有这个错误:

Undefined symbols for architecture x86_64:
  "my::Queue<int>::Queue()", referenced from:
      _main in ccdwI88X.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

对于这个代码'main.cpp':

#include "Queue.hpp"

int main()
{
  my::Queue<int> myqueue;
  return 0;
}

'Queue.hpp':

#ifndef QUEUE_HH__
#define QUEUE_HH__

namespace my
{
  template <typename T>
  class Queue
  {
  public:
    Queue();     
  };
}

#endif

和'Queue.cpp':

#include "Queue.hpp"

template <typename T>
my::Queue<T>::Queue() 
{
}

【问题讨论】:

  • 请至少阅读本页右侧“相关”列表中的第一个问题。
  • 我读过,但和我遇到的问题不一样。还是谢谢。
  • 他建议把类的定义放到一个头文件中,但是我这样做了(Queue.hpp),反正不管用...
  • 您在帖子中的代码在标题中没有您的类模板构造函数的完整定义。它只有一个声明。

标签: c++ linker


【解决方案1】:

这里发布的答案:https://stackoverflow.com/a/312402/700926 是我认为你需要的。

如果我将您的 Queue.cpp 文件编辑为:

#include "Queue.hpp"

template <typename T>
my::Queue<T>::Queue() 
{

}

template class my::Queue<int>;

.. 它编译得很好。

详细解释请参考我最开始提到的网址。

【讨论】:

  • 好的,它工作。但是我在想模板的原理是它可以采用我们事先不知道的类型......如果我想用我的队列类创建一个库,并且我想在不知道哪种类型的情况下将来使用它怎么办? TI 将使用?
  • 正如这里提到的:stackoverflow.com/a/312402/700926:“如果您不知道模板将使用哪些模板参数,则必须将所有定义放入标题中”。这应该是你正在寻找的:)
  • 好的,谢谢。但这就像在 main.cpp 中一样,我包括 .hpp,后跟 .cpp。有点奇怪。
【解决方案2】:

使用模板时最简单、最安全的做法是始终将类函数定义(实现)放在.hpp 文件中,而不是放在单独的.cpp 文件中。

所有细节也在这里:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 2015-10-27
    • 1970-01-01
    • 2014-05-14
    • 2016-05-31
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多