C ++模板错误与运算符重载不匹配

时间:2015-05-09 10:27:17

标签: c++ operator-overloading

我正在开发一个通用编程项目。

这是我的代码:

//header A.h
template<typename T>
struct Node {
    T key;
    bool operator>(Node<T>& node);
};

template<typename T>
bool Node<T>::operator>(Node<T>& node) {
    return (key > node.key); 
}
//-----------------------------------------
template<typename T>
struct Pair {
    T k1, k2;
    bool operator>(Pair<T>& p); 
}
template<typename T> bool Pair<T>::operator>(Pair<T>& p) {
    return (k1 > p.k1)&&(k2 > p.k2);
}

和,标题B.h(包括标题A.h):

class Tree {
    int i, j;
    Tree(int i, int j) : i(i), j(j) {}
    bool operator>(Tree& tree);
};
bool Tree::operator>(Tree& tree) {
    Pair<int> p1 = Pair<int>(i,j);
    Pair<int> p2 = Pair<int>(tree.i,tree.j);
    return (p1 > p2);
}

最后是主要功能:

main() {
    Tree t1 = Tree(10,11);
    Tree t2 = Tree(1,2);
    Node<Tree> n1 = Node<Tree>(t1);
    Node<Tree> n2 = Node<Tree>(t2);
    if(n1 > n2) std::cout <<"ture\n"; //here i got warning: "instantiating from here"

    return 0;
}

问题: 我收到警告:candidates are: bool Tree::operator>(Tree&)就行了: bool operator>(Pair<T>& p); 另外,我在第no match for ‘operator>’ in ‘((Node<Tree>*)this)->Node<Tree>::key > rightNode-

行上有一个错误:return (key > node.key);

问题:为什么编译器无法从operator>结构的Tree函数到达operator>的{​​{1}}?换句话说,我该如何解决这个问题?

P.S。由于这是一个不太直观的场景,问题的标题可能不那么准确。如果你有更好的召唤,我会很高兴接受。

1 个答案:

答案 0 :(得分:0)

默认情况下,类的成员是私有的。将Tree设为struct,它应该会改进。