Namespaces and Operator Overloading in C++
-
05-07-2019 - |
Question
When authoring a library in a particular namespace, it's often convenient to provide overloaded operators for the classes in that namespace. It seems (at least with g++) that the overloaded operators can be implemented either in the library's namespace:
namespace Lib {
class A {
};
A operator+(const A&, const A&);
} // namespace Lib
or the global namespace
namespace Lib {
class A {
};
} // namespace Lib
Lib::A operator+(const Lib::A&, const Lib::A&);
From my testing, they both seem to work fine. Is there any practical difference between these two options? Is either approach better?
Solution
You should define them in the library namespace. The compiler will find them anyway through argument dependant lookup.
No need to pollute the global namespace.
OTHER TIPS
Putting it into the library namespace works because of Koenig lookup.
You should define it in the namespace, both because the syntax will be less verbose and not to clutter the global namespace.
Actually, if you define your overloads in your class definition, this becomes a moot question:
namespace Lib {
class A {
public:
A operator+(const A&);
};
} // namespace Lib