首页 > 解决方案 > 在 G++ 中访问相等比较运算符时出现歧义错误

问题描述

在多重继承的情况下,如果所有父类都有自己的相等比较operator ==,并且子类有(朋友)函数operator ==,如示例中所示:

struct A {
    bool operator ==(const A&) const = default;
};

struct B {
    bool operator ==(const B&) const = default;
};

struct C : A, B {};

constexpr bool operator ==(const C&, const C&) { return true; }

static_assert( C{} == C{} );

GCC 打印以下关于歧义的错误以尝试比较子对象:

 error: request for member 'operator==' is ambiguous
   13 | static_assert( C{} == C{} );
 note: candidates are: 'bool B::operator==(const B&) const'
 note:                 'bool A::operator==(const A&) const'

演示:https ://gcc.godbolt.org/z/W3qer376d

这个错误看起来令人惊讶,因为operator ==(const C&, const C&)它应该是最适合实际参数的首选。这仅仅是 GCC 的一个缺陷吗?

标签: c++g++language-lawyermultiple-inheritancecomparison-operators

解决方案


事实上,全球运营商operator==(const C&, const C&)具有优先权。然而,编译器“想知道”所有可能性以便做出决定:换句话说:一旦你尝试使用operator==编译器,编译器就会要求你没有歧义,即使所需的替代方案不在歧义之间。


struct C : A, B { using A::operator==; }; 

这解决了歧义并允许您使用全局operator==

https://onlinegdb.com/nxMjPN4NC

#include <iostream>

struct A {
    bool operator ==(const A&) const { std::cout << "A" << std::endl; return true; };
};

struct B {
    bool operator ==(const B&) const { std::cout << "B" << std::endl; return true; };
};

struct C : A, B 
{
    //using A::operator==; // Uncomment this to make it work.
};

bool operator ==(const C&, const C&) { std::cout << "C" << std::endl; return true; }

int main()
{
    C c1, c2;
    
    c1==c2;

    return 0;
}

结果(解决后):

C


推荐阅读