Possible Duplicate:
Why can templates only be implemented in the header file?




你好。我在c ++中有一个愚蠢的程序,包含一个带有使用模板类的头文件和一个带有方法实现的cpp文件。

这是标题:

namespace SynQueueing {
  template < class T, unsigned long SIZE = 0 >
  class CommQueue {
     public:
        CommQueue();
        ~CommQueue();
  }
}


这是cpp

#include "myheader.h"
using namespace SynQueueing;
/* Default constructor */
template < class T, unsigned long SIZE >
CommQueue<T, SIZE>::CommQueue() {
}
/* Default destructor */
template < class T, unsigned long SIZE >
CommQueue<T, SIZE>::~CommQueue() {
}


我主要是简单地创建CommQueue对象

CommQueue cq;

当然在cpp主文件中包含CommQueue.h。

好吧,编译器疯狂地告诉我:


  /tmp/ccvJL8VI.o:在函数main中:
  
  entry.cpp :(。text + 0x2c):对`SynQueueing :: CommQueue :: CommQueue()'的未定义引用
  
  entry.cpp :(。text + 0x10e):对`SynQueueing :: CommQueue ::〜CommQueue()'的未定义引用
  
  entry.cpp :(。text + 0x135):对`SynQueueing :: CommQueue ::〜CommQueue()'的未定义引用
  
  collect2:ld返回1退出状态


entry.cpp是main所在的文件。
任何想法?

谢谢

最佳答案

对于模板,通常必须将实现放在.h / .hpp文件中。这看起来似乎是不自然的,但是可以将模板看作是一些特殊的“宏”,一旦您给出了实际的类型或值(在您的情况下为类型T和值SIZE),编译器就会对其进行扩展。由于大多数编译器都已实现(在您的情况下为GCC),因此编译器必须在编译时查找要插入的代码,并且看到已定义模板的实例化。

关于c++ - C++模板基本程序,链接器找不到构造函数和析构函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4255980/

10-11 21:54