2011-11-04 78 views
8

Estoy recibiendo el siguiente error en mi programa en C++:ningún constructor predeterminado adecuado disponible

1>   c:\users\thom\documents\cworkspace\barnaby\barnaby\timezone.cpp(14) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled 

Esto es un poco en la pila de errores, pero los puntos de esta línea de código:

static std::map<const std::string, Timezone> timezoneMap; 

La razón es que Timezone tiene un constructor bastante elaborado, pero no tiene un constructor predeterminado. Aquí está la parte del error:

c:\program files\microsoft visual studio 10.0\vc\include\map(215): error C2512: 'Timezone::Timezone' : no appropriate default constructor available 

1> c: \ archivos de programa \ Microsoft Visual Studio 10.0 \ VC \ include \ mapa (210): durante la compilación de la función miembro de plantilla de clase 'Zona horaria & std :: mapa < _Kty, _Ty> :: operador [] (const std :: basic_string < _Elem, _Traits, _Ax> &)'

Mi pregunta es, ¿por qué? ¿Por qué el mapa está tratando de construir un objeto Timezone? ¿Por qué debería ser necesario si siempre pongo objetos completamente formados en mi mapa? Especialmente, ¿por qué este error cuando inicializo el mapa?

Respuesta

12

Probablemente se esté utilizando el map 's operator[] cuales qué requieren el constructor por defecto (si no fuera así, ¿cómo podría manejar el caso en que la clave no existe en el mapa?). Si usa insert en su lugar puede ser capaz de salirse con la suya sin proporcionar uno (no recuerdo si el estándar requiere un constructor predeterminado para todos los mapas, o simplemente cuando usa ese operador).

+1

+1 Cosas buenas. Tenga en cuenta que para 'std :: map ' con 'explícito Foo :: Foo (int)' el único constructor y con el constructor de copia explícito, siempre puede decir 'm.insert (std :: make_pair (1, 5)); ', pero solo puede decir' m.insert (std :: make_pair (1, Foo (5))); 'en C++ 11. –

1

El objeto de mapa necesita un constructor predeterminado cuando accede a la estructura usando [] (mi explicación anterior fue tan intrincada que no tiene sentido, lo siento). Ver: Why does the C++ map type argument require an empty constructor when using []?

+0

Esto suena mal. No se crean objetos "invisiblemente". El mapa solo crea un objeto cuando explícitamente lo desea. –

+0

Tienes razón. Totalmente no dije lo que quiero decir. @ Mark-B lo hizo. – drdwilcox

Cuestiones relacionadas