我试图重载 ostream << 运算符以打印出泛型类型的变量,但是 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 文件的底部显式实例化了我的节点
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>&)'