다음을 통해 공유


컴파일러 오류 C2316

'class_type': 소멸자 및/또는 복사 생성자에 액세스할 수 없거나 삭제되어 catch할 수 없습니다.

값이나 참조로 예외가 catch되었지만 복사 생성자, 할당 연산자 또는 둘 다 액세스할 수 없습니다.

설명

Visual Studio 2015의 규칙 변경으로 인해 이 오류가 파생된 MFC 예외의 잘못된 catch 문에 CException적용되었습니다. 상속된 프라이빗 복사 생성자가 있으므로 CException 클래스와 해당 파생 개체는 복사할 수 없으며 값으로 전달될 수 없으므로 값으로 catch할 수도 없습니다. 이전에 값으로 MFC 예외를 catch한 Catch 문은 런타임에 catch되지 않은 예외로 이어졌습니다. 이제 컴파일러는 이 상황을 올바르게 식별하고 오류 C2316을 보고합니다. 이 문제를 해결하려면 고유한 예외 처리기를 작성하는 대신 MFC TRY/CATCH 매크로를 사용하는 것이 좋습니다. 코드에 적합하지 않은 경우 대신 참조로 MFC 예외를 catch합니다.

예시

다음 샘플에서는 C2316을 생성하고 이를 해결하는 방법을 보여 줍니다.

// 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");
    }
}