为什么在需要为完全对象类型时实例化类模板?

时间:2015-02-21 08:09:31

标签: c++ templates

如果N3797::14.7.1/1 [temp.inst]

,可以显式或隐式地对类模板进行实例化,并隐式实例化类模板
  

除非已明确表示类模板特化   实例化(14.7.2)或明确专门化(14.7.3),类   模板特化是在隐式实例化的时候   在需要a的上下文中引用特化   完全定义的对象类型或类的完整性   type会影响程序的语义。

让我举一个例子,当不需要上下文时,类类型是完全定义的:

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

DEMO

在该示例中,类模板既未明确也未隐式实例化。所以,我们实际上没有类A<int>的定义。但尽管事实上它运作良好。你无法解释这种行为。

2 个答案:

答案 0 :(得分:0)

请参阅14.7.1/4上的示例,该示例演示a -> foo();是“需要完全定义的对象类型的上下文”。

答案 1 :(得分:0)

[expr.ref] / p2,强调我的:

  

对于第二个选项(箭头),第一个表达式应具有指针   完成类类型。

为什么你认为它是一个不需要完全定义的对象类型的上下文?