hash_value is not overloaded for arrays for older versions of Visual C++. There is a work around so that boost::hash<T[N]>, boost::hash_combine and boost::hash_range work. On these compilers the wrong overload of hash_value is called when the argument is a hash function pointer. So calling hash_value doesn't work but boost::hash does work (and it's recommended that user never call hash_value directly so this shouldn't be a problem). This platform has poor support for long double so the hash function perform poorly for values out of the range of double or if they differ at a greater precision that double is capable of representing. These examples only work on compilers with support for ADL. It is possible to work around this, but I wanted to keep the example code as clean as possible. It appears that Borland doesn't find friend functions defined in a class by ADL. This is easily fixed but this example is meant to show the typical way of customising boost::hash, not the portable way. The test demonstrates a Borland bug - functions that aren't in a namespace don't appear to be found by ADL. Debug containers aren't supported on Apple's version of gcc 4.2.