Почему классу, используемому в качестве значения в карте STL, нужен конструктор по умолчанию в ...? - PullRequest
7 голосов
/ 27 февраля 2010

Ниже приведен класс, используемый в качестве значения на карте:

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

};

Внутри основной ():

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 для компиляции.

1 Ответ

11 голосов
/ 27 февраля 2010

operator[] выполняет двухэтапный процесс. Сначала он находит или создает запись карты для данного ключа, затем он возвращает ссылку на часть значения записи, чтобы вызывающий код мог прочитать или записать его.

В случае, если запись не существовала ранее, значение, равное половине записи, должно быть построено по умолчанию, прежде чем она будет назначена. Именно так интерфейс должен работать, чтобы соответствовать случаю, когда запись уже существовала.

Если вам нужно использовать такой тип на карте, вам следует избегать использования operator[], используя find и insert «вручную».

...