【发布时间】:2017-05-21 16:34:38
【问题描述】:
VS2017 15.1编译失败如下代码:
template<int data_size>
struct Data { };
template<int s>
struct Base
{
static constexpr int size() { return s; }
};
template<int s>
struct Derived : Base<s> // struct Derived
{
Data<Base<s>::size()> data;
};
int main()
{
Derived<1> c;
}
错误是:
error C2975: 'data_size': invalid template argument for 'Data', expected compile-time constant expression note: see declaration of 'data_size' note: see reference to class template instantiation 'Derived<s>' being compiled
如果我没有从Base 派生Derived,错误就会消失。使用 gcc 5.4.0 和 clang 4.0.0 在这两种情况下一切都很好。
这段代码有什么问题吗?
【问题讨论】:
-
Data<size()> data和Data<Derived::size()> data是否出现同样的错误? -
如果你第一次调用并存储结果是这样的:
static constexpr auto size{ Base<s>::size() };,你可以在之后使用它:Data<size> data;。这可以编译,但我不确定为什么直接将其作为模板参数不可以。 -
@melpomene
Data<size()>产生错误,Data<Derived::size()>工作正常(但为什么?)。 -
@melpomene
Data<size()> data是非法的,因为在非限定查找期间未找到依赖基类的成员。但如果 MSVC 允许,我不会感到惊讶。
标签: c++ c++11 templates visual-studio-2017 constexpr