我有以下文件
// File : Node.hpp
#ifndef NODE_H
#define NODE_H
template <class T>
class Node
{
public:
Node(T data);
private:
T data_;
};
template class Node<int>;
#endif
第二个文件是Node.cpp
#include "Node.hpp"
template <class T>
Node<T>::Node(T data)
{
data_ = data;
next_ = 0;
}
现在在a.cpp文件中我有
#include "Node.hpp"
#include <iostream>
int main()
{
Node<int> a(20);
}
编译时我得到了
meow@vikkyhacks ~/Arena/c/LinkedList $ g++ -I ./include/ lib/Node.cpp a.cpp -o main && ./main && echo && rm main
/tmp/ccswcJfR.o: In function `main':
a.cpp:(.text+0x15): undefined reference to `Node<int>::Node(int)'
collect2: ld returned 1 exit status
正如您所看到的,template class Node<int>;
已经Node.hpp
,但链接器仍在抱怨我认为它无法找到Node的构造函数。我该怎么做?
这不是Why can templates only be implemented in the header file?的副本,因为我已经阅读过它并没有帮助我解决这个问题。我需要知道“如何将模板构造函数与类定义一起使用?”这不在重复的线程中讨论
答案 0 :(得分:2)
您需要在Node.cpp中显式实例化实现可用的类以及构造函数定义之后的类。即您拥有的template class Node<int>;
行,将其移动到Node.cpp文件中,并在构造函数定义之后。