这是出于对 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++ 设计实践吗?这对我来说当然看起来很奇怪,所以我想知道这是否是某种未定义的行为,它恰好取决于编译器,有很多陷阱和陷阱,或者它是否是模板的明确使用。
看到这方面的任何实际例子会很有趣。