如何使用初始化列表来初始化一个二维向量成员?

3
我有这段代码:
#include <initializer_list>
#include <vector>    

class Foo {
    std::vector<std::vector<int> > data;
    public:
    Foo(std::initializer_list<std::initializer_list<int> > & data) : data(data) {}
};

int main(){
    Foo f {{1,2},{3,3}};
    return 0;
}

编译器报错:

initalizer_list_test.cpp: In constructor ‘Foo::Foo(std::initializer_list<std::initializer_list<int> >&)’:
initalizer_list_test.cpp:11:79: error: no matching function for call to ‘std::vector<std::vector<int> >::vector(std::initializer_list<std::initializer_list<int> >&)’
     Foo(std::initializer_list<std::initializer_list<int> > & data) : data(data) {}
                                                                               ^
initalizer_list_test.cpp:11:79: note: candidates are:
In file included from /usr/include/c++/4.8.2/vector:64:0,
                 from initalizer_list_test.cpp:2:
/usr/include/c++/4.8.2/bits/stl_vector.h:392:9: note: template<class _InputIterator, class> std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&)
         vector(_InputIterator __first, _InputIterator __last,
         ^
/usr/include/c++/4.8.2/bits/stl_vector.h:392:9: note:   template argument deduction/substitution failed:
initalizer_list_test.cpp:11:79: note:   candidate expects 3 arguments, 1 provided
     Foo(std::initializer_list<std::initializer_list<int> > & data) : data(data) {}

如何使其正常工作?


std::initializer_list<std::vector<std::vector<int>>> 行不行? - JonPall
1个回答

4

首先,只需使用向量的初始化列表来初始化二维向量。然后,按值取而不是按引用取(据我所知,初始化列表通常按值传递,并且非常量引用将不起作用):

Foo(std::initializer_list<std::vector<int> > data) : data(data) {}

类型不需要匹配吗?编译器如何仅通过 int 类型的 1D 向量作为初始化器类型来区分 1D 和 2D 呢? - JonPall
1
@JonPall,向量可以使用初始化器列表来初始化它们的 T。 因此,{{1, 2}} 匹配一个包含两个元素的向量的初始化程序列表,该列表可用于初始化成员,因为列表中包含 std::vector<int>,就像成员所需的一样。 - chris
2
@texasbruce,确切地说,这是一个初始化列表的初始化列表。它应该是向量的初始化列表。调用时的匹配效果很好。 - chris
@chris 但是为什么初始化列表的初始化列表不起作用呢? - SwiftMango
@texasbruce,我可能有点混乱,但是向量的构造函数需要一个std::initializer_list<std::vector<int>>。这种转换不能应用于列表的所有元素以更改列表的整个类型。 - chris
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接