別スレで紹介されてた↓
ttp://www.gotw.ca/publications/mill17.htm
を読んでおどろいた。

template<class T> void f( T ) {}
template<class T> void f( T* ) {}
template<> void f<>(int*) {}
と書くのと
template<class T> void f( T ) {}
template<> void f<>(int*) {}
template<class T> void f( T* ) {}
と書くのじゃ順番が違うだけなのに
f((int*)0);
の結果が変わるなんてまったく知らなかったーよ