我试图重载ostream<< operator打印出一个泛型类型的变量,但是main.cpp找不到实现。我假设这是因为实现存在于.cpp文件中。我知道模板函数通常必须在头文件中定义,但是对于显式实例化的函数不应该这样。当我将实现复制到我的头文件中时,它可以正常工作。
我在想我正在遇到模板化朋友功能所特有的问题。以下是我的代码的相关部分。
我转发声明我的Node类和运算符重载
template <typename T> class Node;
template <typename T> ostream& operator<< (ostream&, Node<T>&);
我在头文件(Tree.h)中声明了运算符重载
template <typename T>
class Node
{
...
friend ostream& operator<< <T> (ostream&, Node<T>&);
T data;
...
}
在我的.cpp文件中,我实现了它
#include "Tree.h"
template <typename T>
ostream& operator<< (ostream& out, Node<T>& node)
{
out << node.data;
return out;
}
我在Tree.cpp文件的底部显式实例化了我的Node
template class Node<int>;
然后我终于从main.cpp中调用它了
int main()
{
Node<int>* n0 = new Node<int>(0);
cout << (*n0);
}
我收到以下错误:
undefined reference to 'std::ostream& operator<< <int> (std::ostream&, Node<int>&)'