在 G++ 中访问相等比较运算符时出现歧义错误
Ambiguity error accessing equality comparison operator in G++
在多重继承的情况下,如果所有父 class 都有自己的相等比较 operator ==
,并且子 class 有一个(朋友)函数 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 的一个缺陷吗?
确实全局运算符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
在多重继承的情况下,如果所有父 class 都有自己的相等比较 operator ==
,并且子 class 有一个(朋友)函数 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 的一个缺陷吗?
确实全局运算符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