template 関数の部分特殊化ってできないんだっけか

stream に任意の型を書き込んだり読み込んだりしたいなぁというようなことを思った。関数ポインタなりを渡しても良かったんだけど、せっかくなので特殊化で楽をしたい。が、思ったよりうまくいかなくて困った。


おおよそこういうソースになることを期待した。

vector<string> v = read<vector<string> >(in);

int や string は特殊化すればいいので特に問題なし。問題は vector。部分特殊化すればいいのかな、ということでおおよそこういうソースを書いてみた。

template <typename T>
vector<T> read<vector<T> >(istream& in) {
  int size = read<int>(in);
  vector<T> l;
  for (int i = 0; i < size; i++) {
    l.push_back(read<T>(in));
  }
  return l;
}

ところがこれがダメなのだ。gcc 3.4 でコンパイルしていたら、関数が ambiguous だと怒られる。何のこっちゃと思って、gcc 4 でコンパイルしたらどうやらこういうことのようだ。

error: function template partial specialization ‘read > >’ is not allowed

関数の部分特殊化はダメなんですかね。ambiguous の原因は template 引数と関数名で識別しているため、read と区別が付かないからなんだろう(と予想)。うーん。もう、ここら辺まで来ると仕様が何なのかわからないし、調べる気も起きない。ダメなものはダメであきらめる。

ちなみに、上のプログラムは template クラスの static メンバに押し込むとちゃんとコンパイルできるようになった。template クラスの部分特殊化は OK だからのようだ。なんだかなぁ。