Неоднозначная перегрузка для оператора, когда в разных пространствах имен

Файл 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?

2

Решение

Вы определили одну и ту же функцию дважды; что вы ожидаете
случиться? Компилятор находит SomeNamespace::operator== с
поиск безусловного имени, и ::operator== с ADL. поскольку
обе имеют одинаковую подпись, для
компилятор, чтобы выбрать один над другим.

Как правило, перегруженные операторы для типа должны быть
определяется в том же пространстве имен, что и тип, и нигде больше.
(Если перегруженный оператор принимает два разных типа, определяется
в двух разных пространствах имен, я бы поставил оператор в глобальном
Пространство имен. Но такие случаи редки.)

2

Другие решения

В вашей программе operator== определяется в глобальном пространстве имен и Somenamespace.

Поэтому, когда вы пытаетесь получить доступ к operator== тогда компилятор не может решить, какую функцию вызывать, поскольку обе функции имеют одинаковую сигнатуру и обе видны для компилятора.

Так использовать operator== определенный в SomeNamespace, который вы должны использовать SomeNamespace::operator== и для определения оператора в глобальном пространстве имен вы должны использовать ::operator==,

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector