Pracowałem nad kodem w C ++ napisanym przez znajomego i otrzymuję następujący błąd, którego nigdy wcześniej nie widziałem podczas kompilacji z gcc4.6:
error: use of deleted function
‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’
Edycja: pochodzi z części kodu używającej strony internetowej boost MSM: Boost
Edit2: nie jest = delete()
nigdzie używany w kodzie źródłowym.
Co ogólnie oznacza ten błąd? Czego powinienem szukać, gdy wystąpi tego typu błąd?
Odpowiedzi:
Komunikat o błędzie wyraźnie mówi, że domyślny konstruktor został niejawnie usunięty . Mówi nawet dlaczego: klasa zawiera niestatyczną zmienną const, która nie została zainicjowana przez domyślny ctor.
Ponieważ
X::x
jestconst
, musi zostać zainicjowany - ale domyślny ctor normalnie nie zainicjowałby go (ponieważ jest to typ POD). Dlatego, aby uzyskać domyślny ctor, musisz sam go zdefiniować (i musi on zostać zainicjowanyx
). Możesz mieć taką samą sytuację z członkiem, który jest odniesieniem:Prawdopodobnie warto zauważyć, że oba te elementy również wyłączą niejawne tworzenie operatora przypisania, zasadniczo z tego samego powodu. Niejawny operator przypisania zwykle wykonuje przypisanie składowe, ale w przypadku elementu członkowskiego stałego lub elementu referencyjnego nie może tego zrobić, ponieważ nie można przypisać elementu członkowskiego. Aby przypisanie zadziałało, musisz napisać własny operator przypisania.
Właśnie dlatego element
const
członkowski powinien być zwykle statyczny - kiedy wykonujesz przypisanie, i tak nie możesz przypisać stałego członka. W typowym przypadku wszystkie Twoje instancje będą miały tę samą wartość, więc równie dobrze mogą mieć dostęp do pojedynczej zmiennej zamiast mieć wiele kopii zmiennej, która będzie miała tę samą wartość.Oczywiście możliwe jest jednak tworzenie instancji z różnymi wartościami - na przykład przekazujesz wartość podczas tworzenia obiektu, więc dwa różne obiekty mogą mieć dwie różne wartości. Jeśli jednak spróbujesz zrobić coś takiego jak zamiana ich, stała składowa zachowa swoją oryginalną wartość zamiast być zamieniona.
źródło
C++ error: use of deleted function
Używasz funkcji oznaczonej jako
deleted
.Na przykład:
= Delete to nowa funkcja języka C ++ 0x. Oznacza to, że kompilator powinien natychmiast przerwać kompilację i narzekać „ta funkcja została usunięta”, gdy użytkownik jej użyje.
Jeśli widzisz ten błąd, sprawdź deklarację funkcji dla
=delete
.Aby dowiedzieć się więcej o tej nowej funkcji wprowadzonej w C ++ 0x, sprawdź to .
źródło
C++ error: use of deleted function
gcc 4.6 obsługuje nową funkcję usuniętych funkcji, w których można pisać
aby wyłączyć domyślny konstruktor.
W tym przypadku kompilator najwyraźniej zauważył, że nie można wygenerować domyślnego konstruktora i
=delete
zrobi to za Ciebie.źródło
Napotkałem ten błąd podczas dziedziczenia z klasy abstrakcyjnej i nie implementowania wszystkich czystych metod wirtualnych w mojej podklasie.
źródło
public virtual
z klasy bazowej drugiego poziomu, w której klasa podstawowa pierwszego poziomu miała jawnie usunięty domyślny konstruktor. Usunięcievirtual
rozwiązało problem bez konieczności wdrażania wszystkich metod.W obecnym standardzie C ++ 0x można jawnie wyłączyć domyślne konstruktory za pomocą składni delete, np
Gcc 4.6 jest pierwszą wersją obsługującą tę składnię, więc może to jest problem ...
źródło
Gcc 4.6 is the first version to support this syntax
Myślę, że to wyjaśniałoby, dlaczego nigdy wcześniej go nie widziałem, ponieważ niedawno zacząłem używać gcc4.6.Przejście z gcc 4.6 na gcc 4.8 rozwiązało ten problem.
źródło