显式实例化模板类是否也显式实例化关联的模板友元函数?

时间:2017-11-16 04:34:22

标签: c++ templates friend explicit-instantiation

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

0 个答案:

没有答案