Throw struct 2669



  • Hallo zusammen,

    ich sehe gerade wahrscheinlich den Wald vor lauter Bäumen nicht mehr.
    Ich habe folgendes Stück Code:

    struct wexception : virtual exception
    {
    	explicit wexception(const wchar_t* msg)	: exception(converter.to_bytes(msg).c_str())
    	{
    		//exception(converter.to_bytes(msg).c_str());
    	}
    
    	wstring what_utf8()
    	{
    		return converter.from_bytes(what());
    	}
    
    private:
    	wstring_convert<codecvt_utf8_utf16<wchar_t>> converter;
    };
    
    ....
    
    try
    {
    	throw wexception(L""); //Hier ist der C2280
    }
    catch(wexception &wex)
    {
    
    }
    

    Fehler:
    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler C2280 'wexception::wexception(const wexception &)': attempting to reference a deleted function

    Soll ja also heißen, dass die Struktur nicht mehr da sein könnte wenn ich aus dem try Block fliege richtig?
    Mache ich eine Klasse aus meiner Abgeleiteten' und setz beim throw ein new davor, dann schreit mein ReSharper "Some control paths may leak this resource acquisition".
    Ich denke mal die meinen damit, dass ich im catch ein delete machen müsste?! Aber das macht mit einer normales exception doch auch keine Sau(?).

    Wie könnte ich das hier best practice umsetzen?



  • Das Problem ist einfach, dass exception 2 Konstruktoren hat: einen ohne Parameter und einen Copy-Construktor, der somit eine exception als Parameter bekommen muss.

    Du übergibst aber ein const char* - das passt nicht.

    Siehe http://www.cplusplus.com/reference/exception/exception/exception/


  • Mod

    Siehe LWG 2176. wstring_convert<…> ist seit C++14 weder kopier- noch moveable. Ich verstehe auch nicht, warum du von exception ableitest.


  • Mod

    wob schrieb:

    Das Problem ist einfach, dass exception 2 Konstruktoren hat: einen ohne Parameter und einen Copy-Construktor, der somit eine exception als Parameter bekommen muss.

    Lies doch mal die Fehlermeldung. Er hat offensichtlich eine eigene exception Klasse definiert.


Anmelden zum Antworten