下面是在映射中用作值的类:
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 < 10; ++i )
{
Book b( i );
mapBooks[ i ] = b;
}
导致错误的语句是:
mapBooks[ i ] = b;
如果我添加默认构造函数,则不会出现错误。但是,我不明白为什么需要。谁能解释一下?如果我使用 insert()
,问题就不会出现。
对了,我是用Visual C++ 2008编译的。
最佳答案
operator[]
执行一个两步过程。首先,它为给定的键找到或创建一个映射条目,然后它返回对条目的值部分的引用,以便调用代码可以读取或写入它。
在entry之前不存在的情况下,需要default构造entry的value half,然后再赋值。这正是界面需要工作以与条目已存在的情况保持一致的方式。
如果需要在 map 中使用这样的类型,则必须通过使用 find
和 insert
来避免使用 operator[]
“手动”。
关于c++ - 为什么在 STL 映射中用作值的类需要在...中有一个默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2346797/