2010-02-27 59 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

相关问题