2011-11-04 17 views
8

Dostaję następujący błąd w moim C++ Program:Nie odpowiedni konstruktor dostępny domyślny

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

Jest nieco w dół w stosie błąd, ale punktów do tego wiersza kodu:

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

Powód jest taki, że strefa czasowa ma raczej skomplikowany konstruktor, ale nie ma domyślnego konstruktora. Oto, że część błędu:

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

1> c: \ program files \ Microsoft visual studio 10.0 \ VC \ include \ mapę (210): podczas kompilowania funkcji składowej klasy szablonu „Strefa czasowa & std :: map < _Kty, _Ty> :: operator [] (const std :: basic_string < _Elem, _Traits, _Ax> &) '

Moje pytanie brzmi: dlaczego? Dlaczego mapa próbuje zbudować obiekt strefy czasowej? Dlaczego miałby on również potrzebować, gdybym zawsze umieszczał w mojej mapie w pełni uformowane obiekty? W szczególności, dlaczego ten błąd podczas inicjowania mapy?

Odpowiedz

12

Pewnie pomocą map „s operator[] który nie wymagają domyślnego konstruktora (jeśli nie, w jaki sposób obsłużyć przypadek, gdy klucz nie istnieje na mapie?). Jeśli użyjesz insert zamiast tego, będzie mógł odejść, nie dostarczając jednego (nie pamiętam, czy standard wymaga domyślnego konstruktora dla wszystkich map lub tylko wtedy, gdy używasz tego operatora).

+1

+1 Dobre rzeczy. Zauważ, że dla 'std :: map ' z 'explicit Foo :: Foo (int)' jedynym konstruktorem i jawnym konstruktorem kopiowania możesz zawsze powiedzieć 'zastępcaownik (std :: make_pair (1, 5)); ', ale możesz tylko powiedzieć' zastępowalnie (std :: make_pair (1, Foo (5)); 'w C++ 11. –

1

Obiekt mapy wymaga domyślnego konstruktora, gdy uzyskujesz dostęp do struktury za pomocą [] (moje poprzednie wyjaśnienie było tak zawiłe, że nie ma znaczenia - przepraszam). Zobacz: Why does the C++ map type argument require an empty constructor when using []?

+0

To brzmi nie tak. Żadne obiekty nie są tworzone "niewidocznie". Mapa tworzy obiekt tylko wtedy, gdy wyraźnie go chcesz. –

+0

Masz rację. Całkowicie nie powiedziałem o co mi chodzi. @ Mark-B zrobił. – drdwilcox

Powiązane problemy