【发布时间】:2015-02-21 08:09:30
【问题描述】:
类模板可以显式或隐式实例化,如果N3797::14.7.1/1 [temp.inst],则类模板被隐式实例化
除非一个类模板特化已经明确 实例化(14.7.2)或显式特化(14.7.3),类 模板特化是隐式实例化的,当 专业化是在需要的上下文中引用的 完全定义对象类型或当类的完整性 类型会影响程序的语义。
让我提供一个示例,当上下文不需要完全定义类类型时:
#include <iostream>
template<class T>
struct A
{
void foo();
};
template<class T> void A<T>::foo(){ std::cout << "foo" << std::endl; }
A<int>* a;
int main(){ a -> foo(); }
在那个例子中,类模板既没有显式也没有隐式实例化。所以,我们实际上没有A<int> 类的定义。但尽管它工作正常。你不能解释一下这种行为吗?
【问题讨论】:
-
你正在调用
A<int>::foo(),所以你需要一个完整的类型。引用不是说在这种情况下模板是隐式实例化的吗? -
我怀疑调用该函数将需要一个正确类型的
this指针和一个可寻址的函数指针(也是完全类型的)。