Consulte también la lista estándar de C ++ y los tipos construibles por defecto
No es un problema importante, solo es molesto, ya que no quiero que se cree una instancia de mi clase sin los argumentos particulares.
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
Esto me da el siguiente error de g ++:
/usr/include/c++/4.3/bits/stl_map.h:419: error: no hay función coincidente para llamar a 'MyClass ()'
Esto se compila bien si agrego un constructor predeterminado; Estoy seguro de que no es causado por una sintaxis incorrecta.
c++
dictionary
Nick Bolton
fuente
fuente
Respuestas:
Este problema viene con el operador []. Cita de la documentación de SGI:
Si no tiene un constructor predeterminado, puede usar funciones de inserción / búsqueda. El siguiente ejemplo funciona bien:
fuente
emplace
en cuenta también en C ++ 11 como una alternativa concisa ainsert
.std::<map>::value_type
en lainsert
llamada?= default
debería funcionar bien.Si. Los valores de los contenedores STL deben mantener la semántica de copia. IOW, deben comportarse como tipos primitivos (por ejemplo, int) lo que significa, entre otras cosas, que deben ser construibles por defecto.Sin este (y otros requisitos), sería innecesariamente difícil implementar las diversas operaciones internas de copia / movimiento / intercambio / comparación en las estructuras de datos con las que se implementan los contenedores STL.Al hacer referencia al estándar C ++, veo que mi respuesta no fue precisa. La construcción por defecto no es, de hecho, un requisito :
Desde 20.1.4.1:
Entonces, estrictamente hablando, su tipo de valor solo necesita ser construible predeterminado si está usando una función del contenedor que usa el constructor predeterminado en su firma.
Los requisitos reales (23.1.3) de todos los valores almacenados en contenedores STL son
CopyConstructible
yAssignable
.También existen otros requisitos específicos para contenedores particulares, como ser
Comparable
(por ejemplo, para las claves en un mapa).Por cierto, lo siguiente se compila sin errores en comeau :
Entonces esto podría ser un problema de g ++.
fuente
Verifique los requisitos del tipo almacenado de stl :: map. Muchas colecciones stl requieren que el tipo almacenado contenga algunas propiedades específicas (constructor predeterminado, constructor de copia, etc.).
El stl :: map necesita un constructor sin argumentos, porque se usa cuando se invoca al operador [] con la clave, que aún no ha sido guardada por el mapa. En este caso, el operador [] inserta la nueva entrada que consiste en la nueva clave y el valor construidos usando un constructor sin parámetros. Y luego se devuelve este nuevo valor.
fuente
Comprobar si:
La declaración std :: map parece correcta, creo.
fuente
Probablemente porque std :: pair lo requiere. std :: pair contiene dos valores usando semántica de valor, por lo que debe poder instanciarlos sin parámetros. Entonces, el código usa std :: pair en varios lugares para devolver los valores del mapa a la persona que llama y esto se hace comúnmente instanciando un par vacío y asignándole los valores antes de devolver el par local.
Puede evitar esto con punteros inteligentes usando un mapa <int, smartptr <MyClass>> pero eso agrega la sobrecarga de verificar punteros nulos.
fuente