どうも、>>100です。

template <typename T, typename U> class hoge
{
public:
void a(void) { cout << "ノーマル a <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; b();};
void b(void) { cout << "ノーマル b <" << typeid(T).name() << ", " << typeid(U).name() << ">" << endl; };
};
template<> void hoge<char, int>::a(void) { cout << "特殊 1 a <char, int>" << endl; b();}
template<> void hoge<char, int>::b(void) { cout << "特殊 1 b <char, int>" << endl; }
template<> void hoge<int, char>::a(void) { cout << "特殊 2 a <int, char>" << endl; b();}
template<> void hoge<int, char>::b(void) { cout << "特殊 2 b <int, char>" << endl; }

int main()
{
hoge<char, char> char_char; char_char.a(); char_char.b();
hoge<char, int> char_int; char_int.a(); char_int.b();
hoge<int, char> int_char; int_char.a(); int_char.b();
hoge<int, int> int_int; int_int.a(); int_int.b();
cin.get();
return 0;
}

エラーの原因は特殊化したa(void)内のb()がb(void)を特殊化する前に書かれていることのようでした。
a(void)とb(void)の記述を逆にすれば通ります。

そういうものなんでしょうか?(規格書読めってことですか)