Chyba C ++ C2280 Pokus o odkaz na odstránenú funkciu

C Error C2280 Attempt Reference Deleted Function



Pri učení referencií C ++ rvalue som našiel chybu

1> e: work jutiltest jutiltest main.cpp (88): chyba C2280: 'MyString :: MyString (const MyString &)': Pokus o odkaz na odstránenú funkciu
1> e: work jutiltest jutiltest main.cpp (72): poznámka: kompilátor tu vygeneroval 'MyString :: MyString'
1> e: work jutiltest jutiltest main.cpp (72): poznámka: 'MyString :: MyString (const MyString &)': Pretože 'MyString' má používateľom definovaný operátor priradenia presunu, je implicitnou funkciou Odstrániť



MMP, pol hodiny neprišiel na to prečo a nakoniec to zistil. . .



Dôvodom tejto situácie je, že konštruktor je odstránený z bezpečnostného hľadiska kompilátora C ++ 11 a konštruktér sa nedá nájsť, takže sa hlási chyba.



Preťažil som operátora priradenia presunu
obrázok

Potom v štandarde C ++ 11 kompilátor automaticky odstráni predvolený konštruktor kopírovania (MyString (MyString & str)), aby zabránil neistému správaniu, ako je plytká kópia, ktorá je ekvivalentná MyString (MyString & str) = delete

Ak v súčasnosti používateľ neprispôsobí konštruktor kopírovania, potom pri kopírovaní objektu nebude možné konštruktor nájsť



Metóda opravy: prispôsobte konštruktor kopírovania alebo presunutie konštruktora

obrázok

Problém bol teda vyriešený!

(Existuje iná podobná situácia, napríklad jedna z mojich tried obsahuje objekt ifstram, ale pri jeho konštrukcii som urobil priradenie a potom sa vyskytla rovnaká chyba)

1> e: work jutiltest jutiltest main.cpp (19): chyba C2280: „Jutil :: BinaryPrintFile :: BinaryPrintFile (const Jutil :: BinaryPrintFile &)“: Pokus o odkaz na odstránenú funkciu
1> f: lib jutil jutil.h (45): poznámka: kompilátor tu vygeneroval súbor „Jutil :: BinaryPrintFile :: BinaryPrintFile“
1> f: lib jutil jutil.h (45): poznámka: 'Jutil :: BinaryPrintFile :: BinaryPrintFile (const Jutil :: BinaryPrintFile &)': Pretože dátový člen volá vymazanú alebo neprístupnú funkciu 'std:: basic_ifstream :: basic_ifstream (const std :: basic_ifstream &) ”, takže funkcia bola implicitne vymazaná
1> c: program files (x86) microsoft visual studio 2017 community vc tools msvc 14.16.27023 include fstream (944): poznámka: „std :: basic_ifstream :: basic_ifstream (const std: : basic_ifstream &) ”: Funkcia bola výslovne odstránená

Dôvod je ten, že veta v konštruktore

this-> is = std :: ifstream ()

Priraďte kópiu ifstream členom triedy, skontrolujte zdrojový kód ifstream a nájdite problém, konštruktor kopírovania v ifstream je = delete (konštrukcia kopírovania nie je povolená)

Môže to byť kvôli bezpečnosti IO ...

Stručne povedané, jednoducho nemôže kopírovať konštrukciu, takže spôsobí chyby

Metóda opravy: Zabudnite na to, nekopírujte štruktúru, iba nové a zmením ju na túto
this-> is = new std :: ifstream ()

Nezabudnite zmeniť člena na ukazovateľ a potom venujte pozornosť uvoľneniu. Hotovo

Vyrieš ten problém!

Memo