可变参数模板结构与std :: array和c样式数组成员之间的区别

时间:2016-09-25 13:18:37

标签: c++ arrays c++11 templates variadic-templates

所以最近我尝试制作了以下结构:

template<int... Factors>
struct Data
{
    static constexpr int arr[sizeof...(Factors)] = {Factors...};
};
int main()
{
    Data<1, 2, 3> p;
    cout << p.arr[0] << " " << p.arr[1] << " " << p.arr[2] << endl;
    return 0;
}

它工作正常。

但是,如果我使用static constexpr int arr[sizeof...(Factors)] = {Factors...};切换static constexpr std::array<int, sizeof...(Factors)> arr {Factors...};,则上面的代码会向我发送

  

对'数据&lt; 1,2,3&gt; :: arr'

的未定义引用

错误。

由于我对可变参数模板相当新,我想知道这两者之间有什么区别,为什么会出现错误?

1 个答案:

答案 0 :(得分:1)

你应该添加这个

template <int ... Factors>
constexpr std::array<int, sizeof...(Factors)> Data<Factors...>::arr;

在结构之外。

我建议用inizialization双重括号

static constexpr std::array<int, sizeof...(Factors)> arr { { Factors... } };