让我们考虑关于模板隐式实例化的简单示例:
#include <iostream>
template<int N>
class A
{
static const int a = A<N-1>::a; //1, OK, doesn't require implicit intantiation
};
template<int N>
class B
{
static const int a = B<1>::a; //2, Error, implicit instantiation of template 'B<1>' within its own definition
};
int main(){ }
标准对此事实并不清楚。它所说的只是N3797::14.7.1/1 [temp.inst]
:
除非已明确表示类模板特化 实例化(14.7.2)或明确专门化(14.7.3),类 模板特化是在隐式实例化的时候 在需要a的上下文中引用特化 完全定义的对象类型或类的完整性 type会影响程序的语义。
1和2都不要求完全定义类类型,但是第二个引起关于隐式实例化的错误。我想了解原因。