Файл 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 и определение в SomeNamespace B.hpp неоднозначны.
Почему компилятор не использует определение в SomeNamespace?
Вы определили одну и ту же функцию дважды; что вы ожидаете
случиться? Компилятор находит SomeNamespace::operator==
с
поиск безусловного имени, и ::operator==
с ADL. поскольку
обе имеют одинаковую подпись, для
компилятор, чтобы выбрать один над другим.
Как правило, перегруженные операторы для типа должны быть
определяется в том же пространстве имен, что и тип, и нигде больше.
(Если перегруженный оператор принимает два разных типа, определяется
в двух разных пространствах имен, я бы поставил оператор в глобальном
Пространство имен. Но такие случаи редки.)
В вашей программе operator==
определяется в глобальном пространстве имен и Somenamespace.
Поэтому, когда вы пытаетесь получить доступ к operator==
тогда компилятор не может решить, какую функцию вызывать, поскольку обе функции имеют одинаковую сигнатуру и обе видны для компилятора.
Так использовать operator==
определенный в SomeNamespace, который вы должны использовать SomeNamespace::operator==
и для определения оператора в глобальном пространстве имен вы должны использовать ::operator==
,