C ++, что является ошибкой "экземпляр оттуда"? - PullRequest
4 голосов
/ 03 апреля 2012

Я новичок в программировании на C ++, мне интересно, что является ошибкой "экземпляр оттуда"?

struct Data {
    Data(int a, int b) {
        x = a;
        y = b;
    }
    int x;
    int y;
};

std::map<int, Data> m;
m[1] = Data(1, 2);

Я получил несколько сообщений об ошибках

  • нет соответствующей функции для вызова функции "Data :: Data ()"
  • "отсюда" ошибка

Спасибо.

Ответы [ 6 ]

8 голосов
/ 03 апреля 2012

Нет конструктора по умолчанию для struct Data.map::operator[] возвращает созданный по умолчанию экземпляр своего типа значения, в этом случае struct Data.

Либо укажите конструктор по умолчанию:

Data() : x(0), y(0) {}

, либо используйтеstd::map::insert():

m.insert(std::pair<int, Data>(1, Data(1, 2)));
3 голосов
/ 03 апреля 2012

C ++, что такое ошибка «экземпляр отсюда»?

Это не ошибка, а продолжение предыдущей ошибки с добавлением дополнительной информации.Компилятор добавляет префикс error:, чтобы было легче прочитать (или проанализировать), какие строки относятся к ошибке.

Вы можете прочитать весь блок как одну ошибку:

Нет соответствующего вызова функции для Data::Data(), созданного из ...

2 голосов
/ 03 апреля 2012

Вам нужно предоставить конструктор, который не принимает аргументов.

Data::Data(){}
0 голосов
/ 03 апреля 2012

нет соответствующей функции для вызова «Data :: Data ()»

Вам необходимо предоставить конструктор по умолчанию. Смотрите ответ на этот вопрос:

Ошибка шаблона: не доступен соответствующий конструктор по умолчанию

ошибка "возникла отсюда"

Вы можете иметь только объявления переменных в глобальной области. Вам нужно сделать это назначение из функции. Правильный код:

#include <map>

struct Data {
    Data(int a, int b) {
        x = a;
        y = b;
    }
    int x;
    int y;

    Data() {};
};

std::map<int, Data> m;

void main()
{
   m[1] = Data(1, 2);
}
0 голосов
/ 03 апреля 2012

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

Для создания этого объекта, созданного по умолчанию, должен быть доступен конструктор по умолчанию.В вашем случае, если вы указали конструктор, который принимает два аргумента (и не предоставили значения по умолчанию для этих аргументов), компилятор не автоматически синтезирует для вас конструктор по умолчанию.

В этих условиях я бы, вероятно, изменил ваш конструктор на что-то вроде этого:

Data(int a=0, int b=0) : x(a), y(b) {}

Обратите внимание, что обычно предпочтительнее инициализировать переменные в списке инициализации (если это возможно), чем присваиватьих в теле конструктора.

0 голосов
/ 03 апреля 2012

Это означает, что ошибка («Нет соответствующего вызова функции») стала очевидной только тогда, когда компилятор начал разрешать ( создание экземпляра ) шаблона std::map::map().

...