これは、C++ の規則に対する好奇心からの質問であり、実際の実際の使用法はありません。テンプレートをいじるときは、次のようなクラス階層を作成しました。
#include <stdio.h>
// Declaration
template <int X = 0>
struct A;
// Specialization for X = 0
template <>
struct A<0>
{
virtual void foo()
{
printf("A<0>::foo()\n");
}
};
// Extended generalized implementation
template <int X>
struct A : public A<0>
{
virtual void foo()
{
printf("A<1>::foo()\n");
}
virtual void bar()
{
printf("A<1>::bar()\n");
}
};
int main()
{
A<> a0;
A<1> a1;
a0.foo();
a1.foo();
a1.bar();
return 0;
}
このコードは、Visual Studio で正常にコンパイルされ、期待される出力を生成します。
A<0>::foo()
A<1>::foo()
A<1>::bar()
これは有効な C++ 設計手法ですか? それは確かに私には奇妙に見えるので、これは、多くの落とし穴や落とし穴のあるコンパイラーに応じてたまたま機能する未定義の動作なのか、それともテンプレートの明確に定義された使用法なのか疑問に思っています。
これの実際の例を見ることは興味深いでしょう。