Tak. Wartości w kontenerach STL muszą zachować semantykę kopiowania. IOW, muszą zachowywać się jak prymitywne typy (na przykład int), co oznacza, między innymi, że powinny być domyślne - konstruktywne.
Bez tego (i innych wymagań) byłoby niepotrzebnie trudne wdrażanie różnych wewnętrznych operacji kopiowania/przenoszenia/wymiany/porównywania struktur danych, w których zaimplementowano kontenery STL.
Po odwołaniu do standardu C++ widzę, że moja odpowiedź nie była dokładna. Default-budowlany jest w rzeczywistości, a nie wymóg:
Od 20.1.4.1:
The default constructor is not required. Certain container class member function signatures specify the default constructor as a default argument. T() must be a well-defined expression ...
Tak, ściśle rzecz biorąc, tylko typ wartości musi być domyślnym constructible jeśli zdarzy ci się być za pomocą funkcja kontenera, który używa domyślnego konstruktora w swoim podpisie.
Rzeczywistymi wymaganiami (23.1.3) ze wszystkich wartości przechowywanych w pojemnikach STL są CopyConstructible
i Assignable
.
Istnieją również inne szczególne wymagania dla poszczególnych pojemników, na przykład Comparable
(np. Dla kluczy na mapie).
Nawiasem mówiąc, co następuje kompiluje bez błędów na comeau:
#include <map>
class MyClass
{
public:
MyClass(int t);
};
int main()
{
std::map<int, MyClass> myMap;
}
Więc może to być g ++ problem.
Powyższy kod kompiluje się poprawnie na MinGW (g ++ 3.4.5) i MSVC++ 2008, pod warunkiem, że podano typedef dla MyType i średnik dołączony do końca klasy. Musisz robić coś innego (np. Dzwoniąc do operatora [] jak wspomniano w bb) - opublikuj * pełny * kod. –
Ach, tak, masz rację. Zrobi to. –
Tak, bez użycia myMap nie wiesz, co trzeba skompilować dla klasy mapy. Którego dostawcę biblioteki biblioteki i wersja może również pomóc. –