Подтвердить что ты не робот

Пространства имен и перегрузка операторов в С++

При создании библиотеки в определенном пространстве имен часто бывает удобно предоставлять перегруженные операторы для классов в этом пространстве имен. Кажется (по крайней мере, с g++), что перегруженные операторы могут быть реализованы либо в пространстве имен библиотеки:

namespace Lib {
class A {
};

A operator+(const A&, const A&);
} // namespace Lib

или глобальное пространство имен

namespace Lib {
class A {
};
} // namespace Lib

Lib::A operator+(const Lib::A&, const Lib::A&);

Из моего тестирования они оба работают нормально. Есть ли какая-либо практическая разница между этими двумя вариантами? Улучшен ли подход?

4b9b3361

Ответ 1

Вы должны определить их в пространстве имен библиотеки. Компилятор найдет их в любом случае через зависимый от аргументов поиск.

Не нужно загрязнять глобальное пространство имен.

Ответ 2

Помещение в пространство имен библиотеки работает из-за поиска Koenig.

Ответ 3

Вы должны определить его в пространстве имен, так как синтаксис будет менее подробным и не загромождать глобальное пространство имен.

Собственно, если вы определяете свои перегрузки в определении вашего класса, это становится спорным вопросом:

namespace Lib {

class A {
public:
    A operator+(const A&);
};

} // namespace Lib