创建模板运算符时出错
Error whilst creating a template operator
我用 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 operator<(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 operator==(const tree& tree1,const tree& tree2);
有谁知道出了什么问题或如何解决?
(这不是关于代码正确性的问题,而是关于重载运算符所需的语法的问题)
您要么需要在 class
中定义非模板函数
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
}
};
或者声明友元函数模板:
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
}
我用 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 operator<(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 operator==(const tree& tree1,const tree& tree2);
有谁知道出了什么问题或如何解决? (这不是关于代码正确性的问题,而是关于重载运算符所需的语法的问题)
您要么需要在 class
中定义非模板函数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
}
};
或者声明友元函数模板:
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
}