Teilen über


Compilerfehler C2316

'class_type': Kann nicht als Destruktor und/oder Kopierkonstruktor nicht abgefangen oder gelöscht werden.

Hinweise

Eine Ausnahme wurde vom Wert oder verweis erfasst, aber auf den Kopierkonstruktor, den Zuordnungsoperator oder beides kann nicht zugegriffen werden.

Konformitätsänderungen in Visual Studio 2015 haben diesen Fehler auf fehlerhafte Catch-Anweisungen von MFC-Ausnahmen angewendet, die von CException. Da CException ein geerbter privater Kopierkonstruktor vorhanden ist, können die Klasse und ihre Ableitungen nicht kopierbar sein und können nicht durch einen Wert übergeben werden, was auch bedeutet, dass sie nicht vom Wert abgefangen werden können. Catch-Anweisungen, die MFC-Ausnahmen anhand des Werts abgefangen haben, führte zuvor zur Laufzeit zu uncaught Exceptions. Nun identifiziert der Compiler diese Situation richtig und meldet fehler C2316. Um dieses Problem zu beheben, empfiehlt es sich, die MFC TRY/CATCH-Makros zu verwenden, anstatt eigene Ausnahmehandler zu schreiben. Wenn dies nicht für Ihren Code geeignet ist, fangen Sie stattdessen MFC-Ausnahmen nach Verweis ab.

Beispiel

Das folgende Beispiel generiert C2316 und zeigt eine Möglichkeit zum Beheben:

// C2316.cpp
// compile with: /EHsc
#include <stdio.h>

struct B
{
public:
    B() {}
    // Delete the following line to resolve.
private:
    // copy constructor
    B(const B&) {}
};

void f(const B&)
{
}

int main()
{
    try
    {
        B aB;
        f(aB);
    }
    catch (B b)    // C2316
    {
        printf_s("Caught an exception!\n");
    }
}