我在另一个类模板中有一个类模板。内部类有一个静态数据成员。我正在努力为它提供一个定义。以下示例适用于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
吗?
答案 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
前缀;即,当嵌套名称说明符或->
或.
左侧的表达式不依赖于模板参数时,或者使用中没有出现模板的范围。 - 结束记录]