1

我试图重载 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>&)'
4

0 回答 0