【发布时间】:2017-10-04 21:46:03
【问题描述】:
我在另一个类模板中有一个类模板。内部类有一个静态数据成员。我正在努力为它提供一个定义。以下示例适用于 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 这里是否允许?
【问题讨论】:
-
不仅允许,而且需要。此时,编译器不知道 Out
::In 是否是类型名/成员/模板。它会猜测成员,并猜测您首先要在 ::,这是一个错误。如上所述,较新的 gcc 在此处提供有用的诊断;以前,情况更糟。 -
@lorro 我认为这是必要的,因为你给出的原因。我的困惑得到了证实