次の方法で共有


コンパイラ エラー C2316

'class_type' : デストラクターとしてキャッチできない、またはコピー コンストラクターがアクセスできないか削除されている、またはその両方です

値または参照によって例外がキャッチされましたが、コピー コンストラクター、代入演算子、またはその両方にアクセスできませんでした。

解説

Visual Studio 2015 の準拠の変更により、CException から派生した MFC 例外の不正な catch ステートメントにこのエラーが適用されました。 CException には継承されたプライベート コピー コンストラクターが含まれたため、 クラスとその派生クラスはコピーできません。また、値渡しすることはできません。これは、値でキャッチできないことも意味します。 MFC 例外を値でキャッチした catch ステートメントは、以前は実行時にキャッチされない例外につながりました。 現在、コンパイラはこの状況を正しく識別し、エラー C2316 を報告するようになりました。 この問題を解決するには、独自の例外ハンドラーを記述するのではなく、MFC TRY/CATCH マクロを使用することをお勧めします。 コードに適していない場合は、代わりに参照によって MFC 例外をキャッチします。

次の例では、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");
    }
}