Reputation: 15284
I have the code:
#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;
}
And the compiler complains:
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) {}
How to get it work properly?
Upvotes: 3
Views: 1047
Reputation: 61900
First, just use an initializer list of vectors in order to initialize the 2D vector. Then just take it by value instead of by reference (initializer lists, to my knowledge, are normally passed by value and a non-const reference won't work):
Foo(std::initializer_list<std::vector<int> > data) : data(data) {}
Upvotes: 4