2014-01-30 47 views
0

我想知道爲什麼下面的代碼不能編譯。這僅僅是一個展示例子,我不爭論標準集裝箱的繼承等構造函數不會繼承,即使使用`使用`

class A : public std::array<int,3> 
{ 
public: 
    using std::array<int,3>::array; 

    // define other methods (no data members) 
}; 

int main(int argc, char **argv) {   
    A a ({1,2,3});  
    return 0; 
} 

編譯器(G ++)抱怨,因爲它只能找到默認的構造函數A()沉綿我想我做了什麼需要繼承std::array的構造函數。

是否有人請注意解釋它爲什麼會這樣做,以及如何在不重新定義和轉發隱式構造函數的情況下如何處理該問題?

當然代碼

using A = std::array<int,3> 

int main(int argc, char **argv) {   
    A a ({1,2,3});  
    return 0; 
} 

編譯罰款,但我需要添加一些自制的運營商,以適應我的目的。

感謝您的幫助。

+2

'std :: array'沒有構造函數;這是一個聚合。嘗試繼承它們可能是一個壞主意。嘗試繼承'std :: array'可能是一個壞主意。 –

+0

構造函數不是繼承的,它們不可以。它更像是一個具有這種語法的代表。 – luk32

+0

@塞巴斯蒂安:哎呀,我的壞。我忘了那個。而且,是的,繼承std :: array是不好的。我會去地獄,然後;) –

回答

0

你構造提供的支撐名單被認爲是作爲一個參數。編譯器正在尋找一個具有A類參數的構造函數。此參數必須能夠接受3個整數的支撐列表才能使用。由於類A沒有這樣的構造函數,因此編譯器會發出錯誤。

+0

顯然是的,但事實是,我試圖繼承聚合機制,這是不可能的。無論如何,謝謝你的回答。 –

+0

在任何情況下,在這裏顯示的代碼中,都會搜索帶有1個參數的構造函數。即使它是完全合法的聚合,您使用的語法也會搜索帶有一個參數的構造函數,而不執行聚合初始化。正確的語法沒有括號(帶或不帶等號)。 – selalerer

+0

那麼,這兩個工作'std :: array',所以我期望(ed)相同的工作在這裏,都是。 –