x86_64架构下未定义符号错误

3

我遇到了这个错误:

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() 
{
}

1
请至少阅读此页面右侧的“相关问题”列表中的第一个问题。 - Mat
我看了,但这不是我遇到的同样问题。无论如何还是谢谢。 - Bebeoix
他建议将类的定义放到头文件中,但我已经这样做了(Queue.hpp),但仍然无法正常工作... - Bebeoix
2
你在帖子中的代码没有完整定义类模板构造函数的头文件。它只有一个声明。 - Mat
可能是C++链接错误:使用模板类的未定义符号的重复问题。 - Troubadour
2个回答

5
这里发布的答案:https://dev59.com/hkXRa4cB1Zd3GeqPvNcD#312402 是我认为您需要的。
如果我将您的 Queue.cpp 文件编辑成这样:
#include "Queue.hpp"

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

}

template class my::Queue<int>;

..它编译得很好。

如果需要详细解释,请参考我在最开始提到的URL。


好的,它可以工作。但是我在想,模板的原则是它可以接受我们事先不知道的类型...如果我想创建一个带有我的队列类的库,并且我想在未来使用它而不知道将使用哪种类型T呢? - Bebeoix
如此提到:https://dev59.com/hkXRa4cB1Zd3GeqPvNcD#312402 :“如果你不知道模板将使用哪些模板参数,你必须把所有的定义放在头文件中。”这应该是你要找的 :) - Lasse Christiansen
好的,它可以工作了,谢谢。但是在main.cpp中,我先包含.hpp文件,然后再包含.cpp文件。有点奇怪。 - Bebeoix

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接