模板在其自身定义中的隐式实例化
Implicit instantiation of the template within its own definition
让我们考虑一下关于模板隐式实例化的简单示例:
#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),类当在需要完全定义的对象类型,或者当类的完整性类型会影响程序的语义。
1和2都不需要完全定义类类型,但是第二个导致了隐式实例化的错误。我想知道为什么。
我认为B<1>
立即失败而A<N-1>
没有失败的原因是因为温度。res#general-8.4
可以在任何实例化之前检查模板的有效性。程序格式错误,无需诊断,如果:
由于一个不依赖于模板参数的构造,模板定义后的假设实例化将是不正确的
相关文章:
- 对显式实例化的模板函数的未定义引用
- 未定义的类模板不会实例化以检查友元函数
- 将自定义 QMap 模板实例化以人类可读的形式保存在 QSettings 中
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- 何时需要实例化函数模板定义?
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 没有为显式模板实例化请求提供合适的定义
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- unique_ptr 使用尚未定义的参数进行实例化不会导致错误
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 如何严格定义函数模板显式实例化规则
- gcc 中的模板显式实例化(定义和声明)
- c++ 11:显式实例化声明vs显式实例化定义
- 当显式模板实例化定义在显式声明之前时,GCC和clang不同意
- 显式模板实例化定义是否也抑制隐式实例化