错误:“ operator ==”不匹配,但确实在基类上定义

问题描述 投票:1回答:1
struct BaseA {
    auto operator==(const BaseA& other) const {return other.a == a;}
    int a;
};

struct B {
    int b;
};

struct A: public BaseA {
    auto operator==(const B& other) const {return other.b == a;}
};

int main() {
    A a{10};
    a == a;

    return 0;
}

它不会编译:

error: no match for ‘operator==’ (operand types are ‘A’ and ‘A’)
note: candidate: ‘auto A::operator==(const B&) const’
note: no known conversion for argument 1 from ‘A’ to ‘const B&’

未将BaseA::operator==列为候选。

但是,如果我注释掉A::operator==方法,它将编译。

因此,我认为比较运算符会得到一些特殊待遇((有时是为子类生成的,有时不会生成,就像那些不符合5规则的那样),但是经过快速搜索后,情况并非如此。

那么,运算符重载的一些规则?

c++ operator-overloading overload-resolution
1个回答
3
投票

[auto operator==(const B& other) const隐藏基数,使用using

struct A: public BaseA {
    using BaseA::operator==;
    auto operator==(const B& other) const {return other.b == a;}
};

Demo


0
投票

这里的运算符没什么特别的,您将得到类似的错误:

struct BaseA {
    auto foo(const BaseA& other) const {return other.a == a;}
    int a;
};

struct B {
    int b;
};

struct A: public BaseA {
    auto foo(const B& other) const {return other.b == a;}
};

int main() {
    A a{10};
    a.foo(a);
}

编译器在foo中找到一个A并停在那里。如果您想同时拥有两者,则需要在范围内显式拉出它:

struct A: public BaseA {
    auto foo(const B& other) const {return other.b == a;}
    using BaseA::foo; 
};
© www.soinside.com 2019 - 2024. All rights reserved.