提问者:小点点

创建模板运算符时出错


我用C++编写了一个泛型树,我的任务之一是创建一个树的树。为此,我需要在树之间创建一个运算符。假设我可以从根目录中的信息中获得我所知道的所有比较信息。我创建了这些模板操作符重载。

template <class T>
class tree {
tree_node<T>* root;
tree_node<T> *largest;

public:
void roll(tree_node<T>* node);

tree();
~tree();
tree_node<T>* get_root();
void set_root(tree_node<T>*);
tree_node<T>* get_largest();
tree_node<T>* most_right(tree_node<T>* node);
void update_largest(tree_node<T>* node);
void update_largest_end(tree_node<T>* node);
tree_node<T>* find(T& data);
bool insert(T& data);
void del(tree_node<T>* node);
bool del(T& data);
void reverse_inorder(list<T>& list);
void partial_reverse_inorder(list<T>& list,int num);
friend bool operator<(const tree<T>& tree1,const tree<T>& tree2);
friend bool operator==(const tree<T>& tree1,const tree<T>& tree2);
};

template<class T>

bool operator<(const tree<T>& tree1,const tree<T>& tree2){

    return tree1.get_root()->data<tree2.get_root()->data; //assuming < operator

}

template <class T>

bool operator==(const tree<T>& tree1,const tree<T>& tree2){

    return tree1.get_root()->data==tree2.get_root()->data; //assuming == operator
}

但是当我尝试编译它时,我得到了以下错误信息:

E:\technion\mivnei\hw1\tree.h:75:68:警告:友元声明“bool operator<(const tree&;,const tree&;)”声明一个非模板函数[-wnon-template-friend]friend bool运算符<(const tree&;tree1,const tree&;tree2);

e:\technion\mivnei\hw1\tree.h:75:68:注意:(如果这不是您想要的,请确保已经声明了函数模板,并在这里的函数名后面添加<>)

E:\technion\mivnei\hw1\tree.h:76:69:警告:友元声明“bool operator==(const tree&;,const tree&;)”声明一个非模板函数[-wnon-template-friend]friend bool运算符==(const tree&tree1,const tree&tree2);

有谁知道哪里出了问题或者怎么解决吗?(这不是关于代码正确性的问题,而是重载运算符所需的语法问题)


共1个答案

匿名用户

您需要在类中定义非模板函数

template <class T>
class tree {
    // ...
    friend bool operator<(const tree<T>& tree1,const tree<T>& tree2){
        return tree1.get_root()->data<tree2.get_root()->data; //assuming < operator
    }
};

或者声明friend函数模板:

template <class T> class tree;

template <class T> bool operator<(const tree<T>& tree1,const tree<T>& tree2);

template <class T>
class tree {
    // ...
    // Declare specialization friend
    friend bool operator< <T>(const tree<T>& tree1,const tree<T>& tree2);
};

template <class T> bool operator<(const tree<T>& tree1,const tree<T>& tree2)
{
    return tree1.get_root()->data<tree2.get_root()->data; //assuming < operator
}