繁体   English   中英

在不同名称空间中时运算符的模棱两可的重载

[英]Ambiguous overload for operator when in different namespaces

文件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== 由于两者的签名完全相同,因此编译器无法选择一个。

通常,应在与该类型相同的名称空间中定义该类型的重载运算符,而在其他地方则不应定义。 (如果重载运算符采用在两个不同名称空间中定义的两种不同类型,则将运算符放在全局名称空间中。但是这种情况很少见。)

在您的程序中,在全局名称空间和Somenamespace中定义了operator==

因此,当您尝试访问operator==编译器将无法解析要调用的函数,因为这两个函数具有相同的签名,并且对编译器都是可见的。

因此,要使用在SomeNamespace中定义的operator== ,必须使用SomeNamespace::operator== ;对于在Global名称空间中定义的operator,必须使用::operator==

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM