См. Также стандартный список C ++ и типы, которые можно построить по умолчанию.
Это не серьезная проблема, просто раздражает, поскольку я не хочу, чтобы мой класс когда-либо создавался без определенных аргументов.
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
Это дает мне следующую ошибку g ++:
/usr/include/c++/4.3/bits/stl_map.h:419: ошибка: нет соответствующей функции для вызова 'MyClass ()'
Это нормально компилируется, если я добавляю конструктор по умолчанию; Я уверен, что это не из-за неправильного синтаксиса.
c++
dictionary
Ник Болтон
источник
источник
Ответы:
Эта проблема связана с оператором []. Цитата из документации SGI:
Если у вас нет конструктора по умолчанию, вы можете использовать функции вставки / поиска. Следующий пример отлично работает:
источник
emplace
на C ++ 11 как краткую альтернативуinsert
.std::<map>::value_type
есть вinsert
звонке?= default
должно работать нормально.Да. Значения в контейнерах STL должны поддерживать семантику копирования. IOW, они должны вести себя как примитивные типы (например, int), что означает, среди прочего, что они должны быть сконструированы по умолчанию.Без этого (и других требований) было бы излишне сложно реализовать различные внутренние операции копирования / перемещения / замены / сравнения структур данных, с которыми реализованы контейнеры STL.После ссылки на стандарт C ++ я вижу, что мой ответ был неточным. По сути, конструкция по умолчанию не является требованием :
Начиная с 20.1.4.1:
Итак, строго говоря, ваш тип значения должен быть конструктивным по умолчанию только в том случае, если вы используете функцию контейнера, которая использует конструктор по умолчанию в своей подписи.
Реальные требования (23.1.3) для всех значений, хранящихся в контейнерах STL:
CopyConstructible
иAssignable
.Существуют также другие особые требования к конкретным контейнерам, такие как
Comparable
наличие (например, для ключей на карте).Между прочим, следующее компилируется без ошибок при комо :
Так что это может быть проблема g ++.
источник
Проверьте требования хранимого типа stl :: map. Многие коллекции stl требуют, чтобы хранимый тип содержал определенные свойства (конструктор по умолчанию, конструктор копирования и т. Д.).
Конструктор без аргументов необходим для stl :: map, потому что он используется, когда operator [] вызывается с ключом, который еще не был сохранен картой. В этом случае operator [] вставляет новую запись, состоящую из нового ключа и значения, созданного с помощью конструктора без параметров. Затем возвращается это новое значение.
источник
Проверить, если:
Я думаю, что объявление std :: map кажется правильным.
источник
Скорее всего, потому, что этого требует std :: pair. std :: pair содержит два значения с использованием семантики значений, поэтому вам нужно иметь возможность создавать их экземпляры без параметров. Таким образом, код использует std :: pair в различных местах для возврата значений карты вызывающей стороне, и это обычно делается путем создания пустой пары и присвоения ей значений перед возвратом локальной пары.
Вы можете обойти это с помощью интеллектуальных указателей, используя map <int, smartptr <MyClass>>, но это добавляет накладные расходы на проверку нулевых указателей.
источник