2014-03-02 178 views
3

我的代碼:如何使用初始化程序列表初始化2D向量成員?

#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) {} 

如何讓它正常工作?

+0

也不會轉回去的std :: initializer_list >> do? – JonPall

回答

4

首先,使用矢量的初始化列表來初始化2D矢量。然後,只需把它按值而不是按引用(初始化列表,就我所知,通常是按值傳遞和非const引用將無法正常工作):

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

不需要匹配?編譯器如何知道1D和2D之間的區別,只需要一個int的1D向量作爲初始化類型? – JonPall

+1

@JonPall,可以使用包含它們的'T'的初始化列表來初始化向量。因此,'{{1,2}}'匹配一個初始化列表,它包含一個包含兩個元素的向量,可以用來初始化成員,因爲列表包含'std :: vector ',就像成員想要的那樣。 – chris

+0

它仍然無法正常工作。錯誤:'initalizer_list_test.cpp:在構造函數'Foo :: Foo(std :: initializer_list >)': initalizer_list_test.cpp:11:77:錯誤:沒有匹配函數調用'std :: vector > :: vector(std :: initializer_list >&)' Foo(std :: initializer_list > data):data(data){} – texasbruce