N4296::14.7.1/1 [temp.inst]告诉我们以下内容:


  类模板专业化的隐式实例化导致
  声明的隐式实例化,但不是
  定义,[...],成员类,[...]


那条规则是关于什么的?让我给你举个例子:

template<class T>
class A
{
public:
    template<class W> class Y; //1, declaration
    template<class V> class U{ V v; };  //2, definition
};

A<int> a; //3, implicit instantiation
int main(){ }


//3处的隐式实例化会导致//2//1处的隐式实例化吗?如果是这样,则使用什么模板参数来实例化那些成员类?

最佳答案

与“外部”模板相比,这些成员模板没有什么特别的。编译器将它们作为声明读取,这样它就知道存在名称为A<T>::Y<W>A<T>::U<V>,与为类A声明模板时非常相似:

template <typename T>
class A {
     int a;
};


它也仅声明类A<T>的存在,而没有实例化它。

实例化推迟到实际使用(或显式实例化)模板化类型之前,后者同样适用于成员模板。

关于c++ - 成员类实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28870175/

10-15 01:08