我正在嘗試在現代版本的 Clang 上構建一個舊的 C 專案并得到很多模棱兩可的錯誤。如果這是基本的東西,我沒有太多的 C 經驗,所以很抱歉。
/home/ubuntu/NameAndTypeResolver.cpp:124:40: error: call to constructor of 'list<list<const dev::libcrunch::ContractDefinition *> >' is ambiguous
list<list<ContractDefinition const*>> input(1, {});
^ ~~~~~
我不確定編譯器在這里要求什么。另外{}語法是什么?
uj5u.com熱心網友回復:
要解決您的問題,請執行以下操作:
std::list<std::list<ContractDefinition const*>> input(1);
// ^^^^ drop the ,{}
這{}是嘗試構造一個型別的物件std::list<ContractDefinition const*>(即 的單個成員input)。
在 C 11 中,原始行將是有效的,因為它明確地創建了std::list<ContractDefinition const*>使用默認建構式的單個物件。
但在 C 17(及更高版本,不確定它是否適用于 C 14)中,{}可用于默認建構式并創建初始化串列(std::initializer_list)。
有std::list<X>一個建構式,它接受(<Count>, <Object>). 當編譯器看到 '{} it can default construct anX usingX{} or create anstd::initializer_list`(或長度為零)時,兩者都是此背景關系中的有效選項。不允許編譯器做出使用哪種決定(即使在這種情況下它們都產生相同的結果)。
我希望我是正確的。
我會在早上檢查負分:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425962.html
上一篇:堆疊分配類的成員在作用域結束時放置new會發生什么?
下一篇:原始指標但現代方式
