在模板化类中定义模板化类的静态数据成员

时间:2017-10-04 21:46:04

标签: c++ templates c++14

我在另一个类模板中有一个类模板。内部类有一个静态数据成员。我正在努力为它提供一个定义。以下示例适用于clang 3.8但不适用于gcc-7.1

template <typename T>
struct Out {
  template <typename U>
  struct In {
    static int var;
  };
};

template <typename T>
template <typename U>
int Out<T>::template In<U>::var;

gcc给出错误:

error: template definition of non-template ‘int Out<T>::In<U>::var’
 int Out<T>::template In<U>::var;
                             ^~~

我要做些什么才能让gcc高兴?

编辑:结果摆脱template让这项工作:

template <typename T>
template <typename U>
int Out<T>::In<U>::var;

还有问题,这里允许template吗?

1 个答案:

答案 0 :(得分:0)

这种类型的定义更常见于template之前的In。此处不需要template关键字,因为Out<T>::In是当前专业化的成员&#34;。

有关在成员名称之前指定何时需要template关键字的规则,请参阅[temp.names] / 4。有关技术术语&#34;当前专业化的成员&#34;的定义,请参见[temp.dep.type] / 4.

但事实上,关键字是允许的,因为语法允许它在任何::和名称之间,并且语义只要求后面的名称与模板参数一起使用或命名类模板([ temp.names] / 5),标准中没有其他规则禁止它。正如[temp.names] / 5中的注释所解释的那样:

  

[注意:typename前缀的情况一样,如果不是绝对必要,则允许使用template前缀;即,当嵌套名称说明符->.左侧的表达式不依赖于模板参数时,或者使用中没有出现模板的范围。 - 结束记录]