2017-07-19 40 views
0

C++構造函數重載歧義我有兩個構造函數的類:與initializer_list

myclass(std::initializer_list<int>); 
myclass(std::initializer_list<std::initializer_list<int>); 

下面的聲明能夠正常工作

myclass obj1 = {{1,2},{3,4},{5,6}}; //a 3x2 matrix 
myclass obj2 = {{1,2,3}}; // a 1x3 matrix 

但下面的聲明不工作,當我嘗試編譯,它說它含糊不清

myclass obj3 = {{1},{2},{3}}; //a 3x1 matrix 

以下問題解決了這個問題:

myclass obj3 = {std::initializer_list<int>({1}), 
       std::initializer_list<int>({2}), 
       std::initializer_list<int>({3})}; 

但我覺得這個解決方案不舒服和難看。是否有可能做更好的事情?

+0

'myclass obj3 = {{{1},{2},{3}}};'工作嗎? – NathanOliver

+0

'{{{1}},{{2}},{{3}}}'怎麼樣? –

+0

@NathanOliver(和Some-programmer-dude)這兩種解決方案都可以工作,但我不明白爲什麼:)無論如何,我一直在尋找一種解決方案,允許保留語法{{1},{2},{3 }},但如果它不可能,我將使用你的其中一個 – Hybridslinky

回答

1

編譯器說{{1},{2},{3}}含糊不清的原因是{1}既可以是int也可以是std::initializer_list<int>。所以,你要麼有int的List或int的List列表和編譯器不能決定你真正想要

當你做{{{1},{2},{3}}}{{{1}},{{2}},{{3}}}最裏面的括號表示int,接下來最裏面的代表名單那些int s,然後最外括號表示該列表的列表。您需要這些額外的大括號來消除編譯器的歧義。