2009-12-20 109 views
1

我想知道爲什麼會出現這樣的錯誤。爲什麼複製構造函數調用其他類的默認構造函數?

no matching function for call to 'Foo::Foo()' 

代碼複製構造函數?假設Foo只是一個具有普通字段的對象(沒有動態分配的內存等),並且它定義的唯一構造函數是一個構造函數,它接受一個參數。

我甚至不知道需要考慮的構造函數。如果代碼說像

bar = thing.bar; // 

和酒吧是Foo類型不同的,與上述的規格,不應該只是產生一個淺拷貝,並用它做什麼?爲什麼需要調用默認構造函數?

+0

向我們顯示您的代碼。你定義了默認的構造函數嗎? – 2009-12-20 05:42:53

+0

如果你添加一個空的Foo :: Foo()的定義,它將被編譯。但是,讓我懷疑的是,爲什麼你試圖在拷貝構造函數中調用它呢?你能告訴我們代碼嗎? – 2009-12-20 05:48:28

回答

8

如果不定義構造函數,編譯器將生成一個默認的構造函數,但是如果你做定義一個構造函數(像拷貝構造函數),編譯不會生成默認的構造函數,所以你還需要定義該構造函數。

+1

+1正確答案。 – 2009-12-20 05:45:26

+0

謝謝。我認爲編譯器只會定義默認構造函數,如果我定義了一個默認構造函數,而不是任何構造函數。 – Anonymous 2009-12-20 05:47:30

3

這聽起來像你已經定義了複製構造函數而沒有定義任何其他構造函數。

一旦你明確聲明瞭一個構造函數,編譯器就不再爲你提供一個默認的構造函數。因此,你不再有機制來構建一個類的對象(因此不能複製它)。

1

如果像你說的,你正在做的「像

bar = thing.bar; 

這大概是你的類的拷貝構造函數的 - 所以bar場被其類的默認構造函數首先初始化,然後使用這個類的賦值操作符對於這一說法。如果bar的類只有一個拷貝構造函數,沒有默認的構造函數,你需要之前類的拷貝構造函數開幕{添加bar(thing.bar)條款並刪除分配(一般無論如何,這是一個好主意,但在「不默認ctor「條件)。

相關問題