2

ファイル 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 の定義を使用しないのはなぜですか?

4

2 に答える 2

2

プログラムoperator==では、Global 名前空間と Somenamespace で定義されています。

したがって、アクセスしようとするとoperator==、コンパイラは呼び出す関数を解決できません。これは、両方の関数が同じシグネチャを持ち、両方がコンパイラに表示されるためです。

そのため、operator==定義済みの SomeNamespace を使用するには、使用する必要がSomeNamespace::operator==あり、グローバル名前空間で定義する演算子には を使用する必要があります::operator==

于 2013-09-12T12:51:29.100 に答える