飛遞歸結構,我想知道爲什麼下面的代碼是錯誤的編譯器:構建與向量
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}};
那是因爲這種嵌套結構的構造不被支持,或者我所做的一切都是錯誤的?
飛遞歸結構,我想知道爲什麼下面的代碼是錯誤的編譯器:構建與向量
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}};
那是因爲這種嵌套結構的構造不被支持,或者我所做的一切都是錯誤的?
#include <boost/variant/recursive_wrapper.hpp>
struct foo;
struct foo {
int a;
vector<boost::recursive_wrapper<foo>> b;
};
如果你不想使用升壓或推出自己的包裝,
考慮使用內部的指針。
你爲什麼需要前向聲明? – 0x499602D2
@ 0x499602D2哦,你說得對。你沒有。 –
你做了一個小錯誤,當然它有效,但你需要使用正確的vector
構造函數。
這將創建Foo的矢量裏面1個對象(自動生成的默認構造函數初始化):
auto v = vector<foo>{1u};
可以列出對象,您創建明確:
auto x = foo{3, vector<foo>{ foo{1, vector<foo>{1u}},
foo{2, vector<foo>{1u}} }};
它實際上是非法的將不完整的類型傳遞給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, {}})}};
'矢量'不具有兩個參數的構造函數服用'int'和'矢量'。如果你打算構建一個包含'foo'單個實例的矢量,那麼這個工作就是這樣的:'foo c = foo {1,vector {{1,vector {1}}}};' –
@IgorTandetnik謝謝,我在找什麼! – user7129841