Пространства имен и перегрузка операторов в C ++ - PullRequest
33 голосов
/ 05 октября 2008

При создании библиотеки в определенном пространстве имен часто удобно предоставлять перегруженные операторы для классов в этом пространстве имен. Кажется (по крайней мере с 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&);

Судя по моему тестированию, они оба работают нормально. Есть ли практическая разница между этими двумя вариантами? Является ли любой подход лучше?

Ответы [ 3 ]

35 голосов
/ 05 октября 2008

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

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

15 голосов
/ 05 октября 2008

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

2 голосов
/ 05 октября 2008

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

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

namespace Lib {

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

} // namespace Lib
...