Zobacz także standardowa lista C ++ i typy konstruowane domyślnie
Nie jest to poważny problem, po prostu denerwujący, ponieważ nie chcę, aby moja klasa była kiedykolwiek tworzona bez określonych argumentów.
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
To daje mi następujący błąd g ++:
/usr/include/c++/4.3/bits/stl_map.h:419: błąd: brak funkcji dopasowującej dla wywołania „MyClass ()”
Kompiluje się dobrze, jeśli dodam domyślny konstruktor; Jestem pewien, że nie jest to spowodowane nieprawidłową składnią.
c++
dictionary
Nick Bolton
źródło
źródło
Odpowiedzi:
Ten problem dotyczy operatora []. Cytat z dokumentacji SGI:
Jeśli nie masz domyślnego konstruktora, możesz użyć funkcji wstawiania / znajdowania. Poniższy przykład działa dobrze:
źródło
emplace
w C ++ 11 jako zwięzłą alternatywę dlainsert
.std::<map>::value_type
winsert
wezwaniu?= default
powinno działać dobrze.Tak. Wartości w kontenerach STL muszą zachowywać semantykę kopiowania. IOW, muszą zachowywać się jak typy pierwotne (np. Int), co oznacza między innymi, że powinny być domyślnie konstruowane.Bez tego (i innych wymagań) niepotrzebnie trudno byłoby zaimplementować różne wewnętrzne operacje kopiowania / przenoszenia / zamiany / porównania na strukturach danych, z którymi zaimplementowano kontenery STL.Po odwołaniu się do standardu C ++ widzę, że moja odpowiedź nie była dokładna. Konstrukcja domyślna nie jest w rzeczywistości wymogiem :
Od 20.1.4.1:
Tak więc, mówiąc ściśle, twój typ wartości musi być domyślnym konstruowalnym tylko wtedy, gdy używasz funkcji kontenera, która używa domyślnego konstruktora w swoim podpisie.
Rzeczywiste wymagania (23.1.3) ze wszystkich wartości przechowywanych w kontenerach STL to
CopyConstructible
iAssignable
.Istnieją również inne specyficzne wymagania dla poszczególnych kontenerów, takie jak istnienie
Comparable
(np. Dla kluczy na mapie).Nawiasem mówiąc, następujące kompilacje bez błędu na comeau :
Więc może to być problem g ++.
źródło
Sprawdź wymagania dotyczące przechowywanego typu stl :: map. Wiele kolekcji stl wymaga, aby typ przechowywany zawierał określone właściwości (domyślny konstruktor, konstruktor kopiujący itp.).
Konstruktor bez argumentów jest potrzebny w stl :: map, ponieważ jest używany, gdy operator [] jest wywoływany z kluczem, który nie został jeszcze zachowany przez mapę. W tym przypadku operator [] wstawia nowy wpis składający się z nowego klucza i wartości skonstruowanych przy użyciu konstruktora bez parametrów. I ta nowa wartość jest następnie zwracana.
źródło
Sprawdź czy:
Wydaje mi się, że deklaracja std :: map wydaje się poprawna.
źródło
Najprawdopodobniej wymaga tego std :: pair. std :: pair przechowuje dwie wartości przy użyciu semantyki wartości, więc musisz mieć możliwość ich wystąpienia bez parametrów. Tak więc kod używa std :: pair w różnych miejscach, aby zwrócić wartości mapy do obiektu wywołującego i jest to zwykle robione przez utworzenie wystąpienia pustej pary i przypisanie do niej wartości przed zwróceniem pary lokalnej.
Możesz obejść ten problem za pomocą inteligentnych wskaźników, używając map <int, smartptr <MyClass>>, ale to zwiększa obciążenie związane ze sprawdzaniem pustych wskaźników.
źródło