理解できないテンプレート(コンパイラはVisual Studio 2012)に関連するエラーが表示されます。これが本質に要約されたコードです:
// Templated class - generic
template <typename T>
class Test
{
public:
void WorksFine() {} // Comiples and works as expected at runtime
void Problem();
};
// Templated class - expicit specialization for T = int.
template <>
class Test<int>
{
public:
void WorksFine() {} // Comiples and works as expected at runtime
void Problem();
};
// The definition below compiles and works fine at runtime.
template<typename T> void Test<T>::Problem() {}
// The definition below gives error C2910.
template<> void Test<int>::Problem() {printf("In Test::Problem(int instantiation)\n");}
WorksFineメソッドの場合、関数定義は明示的に特殊化されたクラス定義内にあり、すべてが正常です。しかし、Problemメソッドの場合、明示的に特殊化されたクラス定義の外部でメソッドを定義すると、エラーC2910が発生します。
どうしてこれなの?エラーC2910は、Test :: Problem()がすでに定義されていることが問題であることを示しています。しかし、それはクラス内で定義されていません...関数定義はなく、宣言だけです。
関数定義をどこに置くかによって、何かを実行できるかどうかはかなり不自由に思えます。これは、機能/セマンティクスの決定ではなく、スタイル/構文の決定でした。私は何かが足りないのですか?