Portability

boost::hash is written to be as portable as possible, but unfortunately, several
older compilers don't support argument dependent lookup (ADL) - the mechanism
used for customization. On those compilers custom overloads for hash_value
need to be declared in the boost namespace.

On a strictly standards compliant compiler, an overload defined in the
boost namespace won't be found when boost::hash is instantiated,
so for these compilers the overload should only be declared in the same
namespace as the class.

On a compliant compiler, when hash_value is called for this type,
it will look at the namespace inside the type and find hash_value
but on a compiler which doesn't support ADL hash_value won't be found.