文件A.hpp:
struct foo
{
int x;
} foo;
inline bool operator ==(const foo &lhs, const foo &rhs)
{
/* ... */
}
文件B.hpp
#include "A.hpp"
namespace SomeNamespace
{
bool operator==(const foo &lhs, const foo &rhs)
{
/* ... */
}
/* ... */
void someFunction(const foo &foo_instance1, const foo &foo_instance2)
{
CPPUNIT_ASSERT(foo_instance1 == foo_instance2);
}
}
带有ASSERT的行的编译器错误是:
error: ambiguous overload for 'operator==' ...
因此,问题在于编译器会同时看到两个比较运算符。
A.hpp的全局命名空间中的定义和B.hpp的SomeNamespace中的定义不明确。
为什么编译器不使用SomeNamespace中的定义?
最佳答案
您已经定义了相同的函数两次;你期望什么
发生?编译器找到SomeNamespace::operator==
与
不合格的名称查找,以及带有ADL的::operator==
。以来
两者都具有完全相同的签名,因此无法
编译器选择一个。
通常,类型的重载运算符应为
在与类型相同的 namespace 中定义,在其他位置没有定义。
(如果重载运算符采用两种不同的类型,则定义为
在两个不同的命名空间中,我会将运算符放在全局
命名空间。但是这种情况很少见。)