コンパイルできないコードがいくつかあります。
namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}
template <typename T>
int ns :: foo :: bar (T*) // this is OK
{
return 0;
}
template <>
int ns :: foo :: bar <int> (int *) // this is an error
{
return 1;
}
エラーは次のとおりです。
コンパイルできるバージョンは次のとおりです。
namespace ns
{
class foo
{
template <typename T> int bar (T *);
};
}
template <typename T>
int ns :: foo :: bar (T*)
{
return 0;
}
namespace ns
{
template <>
int foo :: bar <int> (int *)
{
return 1;
}
}
namespace ns {}
最初の定義は修飾名で非常にうまく定義されているのに、なぜ 2 番目の定義はブロック内になければならないのでしょうか? 言語設計の単なる見落としですか、それとも理由がありますか?