See the compilation failure on godbolt
The full specialization of id2type_impl in the full template definition of msvc_extract_type is the problem, and can easily be solved by swapping the order (full declaration before specialization definition).
If that link is stale, go to godbolt + msvc + add flag "/permissive-" (without quotes), and paste the code below (wish we could use boost + MSVC on godbolt):
template<typename ID, typename T>
struct msvc_extract_type {
template<>
struct id2type_impl<true> { // VC8.0 specific bug-feature.
typedef T type;
};
template<bool>
struct id2type_impl;
typedef id2type_impl<true> id2type;
};