2010-02-27 64 views
7

下面是用作地圖的價值類:爲什麼在STL映射中用作值的類需要在...中使用默認構造函數?

class Book 
{ 
    int m_nId; 
public: 
    // Book() { } <----- Why is this required? 
    Book(int id): m_nId(id) { } 

}; 

在main():

map< int, Book > mapBooks; 

for(int i = 0; i &lt 10; ++i) 
{ 
    Book b(i); 
    mapBooks[ i ] = b; 
} 

導致錯誤的語句是:

mapBooks[ i ] = b; 

如果我添加一個默認的構造函數,錯誤不會出現。但是,我不明白爲什麼需要。誰能解釋一下?如果我使用insert(),則不會出現該問題。

順便說一下,我使用Visual C++ 2008進行編譯。

回答

11

operator[]執行兩個步驟的過程。首先它找到或爲給定鍵創建映射條目,然後它返回對條目的值部分的引用,以便調用代碼可以讀取或寫入它。

在以前不存在條目的情況下,條目的值的一半需要在分配給它之前默認構建。這只是界面需要工作才能與條目已經存在的情況一致的方式。

如果需要在地圖中使用這種類型,則必須通過「手動」使用findinsert來避免使用operator[]

+1

確切地說,'operator []'不分配,但返回對新創建值的引用。分配是用戶代碼。 – 2010-02-27 09:58:08

+0

@dribeas:是的,沒錯。我將更新爲學者! – 2010-02-27 10:09:15

相關問題