2

Visual Studio 目前有一个问题,导致以下内容无法编译,出现错误,

错误 C2797:“vec::v”:未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化

#include <array>

template<class T, int C>
struct vec
{
    typedef T value_type;

    enum { num_components = C };

    std::array<T, C> v;

    template<typename ...Args>
    vec(Args&&... args) : v{{args...}} {}
};

template<class T>
struct vec2 : vec<T, 2>
{
    vec2(T x, T y) : vec(x, y) {}
};

int main(void)
{
    vec<float, 2> v(10.0f, 20.0f);  
}

它的Microsoft Connect 票证已关闭,但有一篇关于它的 MSDN 文章建议“使用内部列表的显式构造”。我不明白如何做到这一点,而且代码对我来说看起来很陌生(初学者)。

任何人都可以协助使用 std::array 的示例吗?

4

1 回答 1

4

在这种特殊情况下,您只需添加一对括号:

vec(Args&&... args) : v({{args...}}) {}

这适用于我想您正在使用的 VS2013。

使用 VS2015,代码无需修改即可工作。

另请注意,对于 C++ 一致性vec2应重写为

vec2(T x, T y) : vec<T, 2>(x, y) {}

或者

using base = vec<T, 2>;
vec2(T x, T y) : base(x, y) {}
于 2015-07-01T08:25:58.030 回答