When making something complicated in meta-programming language, i use the BOOST_MPL_ASSERT macro multiple times, checking the results of every step of the meta-execution. The Boost.MPL library is very useful for that matter. I suggest you use as much code from there as possible, because it's likely it won't contain errors.
When i am not so sure the right specialization for a class is being used, i tend to isolate the right specialization in a namespace. Once you are sure that specialization is valid, you have to make sure that it is chosen. If it's not, you have to find out which one is chosen in its place. Then i'd recommend using Boost.EnableIf to exclude this wrongly-accepted specialization from the selection process.
Last but not least, STLfilt is extremely useful, and you can modify it yourself so that it suits your needs as well as possible.
But the most important thing is to try not to use meta-programming everywhere. It is complicated, so use it only when you really need it.