2016-12-03 51 views
1

飛遞歸結構,我想知道爲什麼下面的代碼是錯誤的編譯器:構建與向量

struct foo { 
    int a; 
    vector<foo> b; 
}; 

int main() { 
    foo c = foo{1, vector<foo>{1, vector<foo>{1}}}; 
} 

,而它這一個編譯:

foo c = foo{1, vector<foo>{1}}; 

那是因爲這種嵌套結構的構造不被支持,或者我所做的一切都是錯誤的?

+2

'矢量'不具有兩個參數的構造函數服用'int'和'矢量'。如果你打算構建一個包含'foo'單個實例的矢量,那麼這個工作就是這樣的:'foo c = foo {1,vector {{1,vector {1}}}};' –

+0

@IgorTandetnik謝謝,我在找什麼! – user7129841

回答

0

使用boost recursive wrapper

#include <boost/variant/recursive_wrapper.hpp> 
struct foo; 
struct foo { 
    int a; 
    vector<boost::recursive_wrapper<foo>> b; 
}; 

如果你不想使用升壓或推出自己的包裝,
考慮使用內部的指針。

+0

你爲什麼需要前向聲明? – 0x499602D2

+0

@ 0x499602D2哦,你說得對。你沒有。 –

0

你做了一個小錯誤,當然它有效,但你需要使用正確的vector構造函數。

這將創建Foo的矢量裏面1個對象(自動生成的默認構造函數初始化):

auto v = vector<foo>{1u}; 

可以列出對象,您創建明確:

auto x = foo{3, vector<foo>{ foo{1, vector<foo>{1u}}, 
          foo{2, vector<foo>{1u}} }}; 
0

它實際上是非法的將不完整的類型傳遞給std::vector。真的沒有什麼合理的理由,但標準是這樣說的。

您的代碼進行編譯,如果你輸入的工作:

foo c = foo{1, vector<foo>{{1, vector<foo>{1}}}}; 

注意額外的一套{}。但它不符合標準,至少在C++ 11中是如此。

有幾種類型,如std::unique_ptr。您可以合法地執行vector<unique_ptr<Foo>>

foo c = {1, {std::make_unique<Foo>(1)}}; 

但是請注意,這make_unique不支持基於{}建設得非常好內它。使用移動構造函數的工作原理:

foo c = {1, {std::make_unique<Foo>(Foo{1, {}})}};