类模板的构造函数与参数包给出C3520错误

时间:2017-11-26 02:00:27

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

尝试一些模板及其用途:

我在这里处理这个简单的结构:

for (size_t i = 0; i < p_size; i++)

我想以这种方式或类似方式使用它:

template<typename T, size_t n>  // templated but not variadic
struct myArray {
    static const size_t SIZE = n;
    T arr_[SIZE];

    myArray() {}   // Default Constructor

    template<class... U>      // Initialization Constructor
    myArray( U pack... ) {    // Templated with variadic parameters of
                              // type U = T upto SIZE = n;
        arr_ = pack...;
    }
};

在visual studio 2017RC中,我不断收到此编译错误:

int main() {
    myArray<char, 6> arr1{ 'a', 'b', 'c', 'd', 'e', 'f' };
    myArray<int, 4> arr2{ 1, 2, 3, 4 };      

    // Or like this:
    myArray<char, 6> arr1 = { 'a', 'b', 'c', 'd', 'e', 'f' };
    myArray<int, 4> arr2 = { 1, 2, 3, 4 };
}

不确定我在这里缺少什么或在初始化构造函数中做什么。

1 个答案:

答案 0 :(得分:3)

编写该构造​​函数的可能方法是

template <class ... U>
myArray( U ... pack ) : arr_ { pack... }
 { }

代码中的两个错误

(1)...在声明中的包名之前;所以

myArray ( U pack ... )
// ..............^^^ wrong

myArray ( U ... pack )
// .........^^^ correct

(2)有很多模式可以使用可变参数包但是

arr_ = pack...;

不正确。

使用带有C风格阵列的可变参数包的常用方法是初始化;也就是说,使用构造函数,在初始化列表中。

所以

myArray( U ... pack ) : arr_ { pack... }
// .....................^^^^^^^^^^^^^^^^

但请记住,像这样的构造函数是危险的,因为没有关于包的元素数量的检查(如果大于SIZE程序的行为是未定义的(这通常是,成为:程序崩溃)。避免这个问题的一种方法是在构造函数的主体中添加static_assert();类似

template <class ... U>
myArray( U ... pack ) : arr_ { pack... }
 { static_assert( sizeof...(U) <= N , "too much values" ); }