コンパイラの警告 (レベル 1) C4251

'type' : クラス 'type1' は、クラス 'type2' のクライアントによって使用される DLL インターフェイスを備えている必要があります

Remarks

__declspec(dllexport) として宣言されたクラスをエクスポートするときにデータが破損する可能性を最小限に抑えるために、次のことを確認してください。

  • すべての静的データが、DLL からエクスポートされた関数を介してアクセスされること。

  • クラスのインライン化されたメソッドのどれも、静的データを変更できないこと。

  • クラスのインライン化されたメソッドのどれも、CRT 関数または、静的データを使用するその他のライブラリ関数を使用しないこと。 詳細については、「DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー」を参照してください。

  • (インライン化されているかどうかにかかわらず) クラスのどのメソッドも、EXE および DLL のインスタンス化に静的データの違いがある型を使用できないこと。

DLL からクラスをエクスポートする際の問題を回避できます。仮想関数、仮想デストラクター、およびその型のオブジェクトをインスタンス化および削除するための関数を持つように、クラスを定義します。 その後は、単にその型に対して仮想関数を呼び出すことができます。

クラスの派生元が C++ 標準ライブラリの型であり、コンパイルしているのがデバッグ リリースであり (/MTd)、コンパイラのエラー メッセージが _Container_base を参照している場合、C4251 は無視できます。

この例では、std::vector から派生した特殊なクラス VecWrapper をエクスポートします。

// C4251.cpp
// compile with: /EHsc /MTd /W2 /c
#include <vector>
using namespace std;
class Node;
class __declspec(dllexport) VecWrapper : vector<Node *> {};   // C4251