让我们考虑一下模板隐式实例化的简单示例:

#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(){ }

DEMO

关于这一事实,标准尚不清楚 . 它所说的只是 N3797::14.7.1/1 [temp.inst]

除非已经显式实例化了类模板特化(14.7.2)或显式专用(14.7.3),否则在需要完全定义的对象类型的上下文中引用特化时或者当需要时,将隐式实例化类模板特化 . 类类型的完整性会影响程序的语义 .

1和2都不要求完全定义类类型,但是第二个引起关于隐式实例化的错误 . 我想明白为什么 .