首页 > 解决方案 > 模板函数中的运算符 << 重载

问题描述

我不知道这段代码的哪一部分是错误的。错误信息如下。

我想重载<<运算符,以便我可以编写类似cout << tree. 我查找了有关模板、友元函数、运算符重载的信息。但我仍然不明白为什么会出现错误。

模板 <类型名值>
类树 {
   受保护:
    节点<值>* root = NULL;
    整数大小 = 0;
    std::ostream& _ostreamOperatorHelp(Node<Value>* node, int level,
                                       std::ostream& os) {
        ...
    }

   上市:
    朋友 std::ostream& operator<< <Value>(std::ostream& os,
                                           树<值> const& 树);
};

模板 <类型名值>
std::ostream& 运算符<<(std::ostream& os, Tree<Value> const& tree) {
    tree._ostreamOperatorHelp(tree.GetRoot(), 0, os);
    返回操作系统;
}

错误信息:

Tree.hpp:129:34: error: declaration of 'operator<<' as non-function
     friend std::ostream& operator<< <Value>(std::ostream& ,
                                  ^~

标签: c++

解决方案


在与特定模板特化成为朋友之前,您必须先声明通用模板函数,如下所示:

template <typename Value>
class Tree;

template <typename Value>
std::ostream& operator<<(std::ostream& os, Tree<Value> const& tree);

template <typename Value>
class Tree {
   protected:
    Node<Value>* root = NULL;
    int size = 0;
    std::ostream& _ostreamOperatorHelp(Node<Value>* node, int level,
                                       std::ostream& os) {
        ...
    }

   public:
    friend std::ostream& operator<< <Value>(std::ostream& os,
                                           Tree<Value> const& tree);
};

template <typename Value>
std::ostream& operator<<(std::ostream& os, Tree<Value> const& tree) {
    tree._ostreamOperatorHelp(tree.GetRoot(), 0, os);
    return os;
}

推荐阅读