Is it acceptable to add types to the std namespace. For example, I want a TCHAR-friendly string, so is the following acceptable?
#include <string>
namespace std
{
typedef basic_string<TCHAR> tstring;
}
Or should I use my own namespace?
Only specializations are allowed. So for example, you are allowed to specialize std::numeric_limits for your type. And this of course must happen in namespace std::. But your typedef isn't a specialization so that's causing undefined behavior.
swap implementations shouldn't go into std any more, as algorithms using swap should rely on argument-dependent lookup.numeric_limits any different from swap in this regard?swap. If it is not allowed to specialize it, that may be because ADL provides a superior alternativetemplate<typename T> struct numeric_limits<MyNumberWrapper<T>> { ... }; perfectly fine.
[C++11: 17.6.4.2.1/1]:The behavior of a C++ program is undefined if it adds declarations or definitions to namespacestdor to a namespace within namespacestdunless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.
No ... part of the point of a namespace is to prevent name collisions on upgrade.
If you add things to the std namespace, then your code might break with the next release of the library if they decide to add something with the same name.
You should use your own namespace as adding code to the standard library will only confuse the users that will look online for informations about that addition.
All that is in std should be only the standard library and nothing else.
basic_string is actually defined as part of the std namespace on page 384 of ISO/IEC 14882:1998.I totally agree with other answers saying that you should put your types in your own namespace to avoid unfortunate name collisions.
However, I wanted to precise that sometimes, you can (and should !) add stuff in the std namespace. This is the case for template specializations of the std::swap method for example, which are used to provide a uniform way to swap objects. For more information on this matter, you can read about the non-throwing swap idiom.
This is an interesting question because it's completely subjective to the project and the engineers' accepted coding standards.
For a single programmer, why not... just be careful.
For teams, make a standard...
For a cross-platform project, hell yeah.
Otherwise, nawdawg.