以下のようなクラスがあります:
//.h file
class __declspec(dllimport) MyClass
{
public:
//stuff
private:
static int myInt;
};
// .cpp file
int MyClass::myInt = 0;
次のコンパイルエラーが発生します。
error C2491: 'MyClass::myInt' : definition of dllimport static data member not allowed
私は何をすべきか?
__declspec(dllimport)
は、現在のコードがsingクラスを実装するDLLであることを意味します。メンバー関数と静的データメンバーはDLLで定義されています、プログラムでそれらを再度定義するとエラーになります。
このクラスを実装するDLLのコードを記述しようとしている場合(したがって、メンバー関数と静的データメンバーを定義している場合)、クラスをマークする必要があります__declspec(dllexport)
代わりに。
これにはマクロを使用するのが一般的です。 DLLをビルドするときに、マクロを定義しますBUILDING_MYDLL
または類似。 MyClass
のヘッダーには、次のようになります。
#ifdef _MSC_VER
# ifdef BUILDING_MYDLL
# define MYCLASS_DECLSPEC __declspec(dllexport)
# else
# define MYCLASS_DECLSPEC __declspec(dllimport)
# endif
#endif
class MYCLASS_DECLSPEC MyClass
{
...
};
これは、DLLとDLLを使用するアプリケーションの間でヘッダーを共有できることを意味します。
クラスdllimportを宣言すると、そのすべてのメンバー関数と静的データメンバーがインポートされます。非クラス型でのdllimportおよびdllexportの動作とは異なり、静的データメンバーは、dllimportクラスが定義されている同じプログラムで定義を指定できません。
それが役に立てば幸い..
クラスをインポートする場合は、すべてのメンバーとともにインポートするため、「クライアント側」でクラスメンバーを定義することはできません。 dll実装キーワードの代わりにdllexportキーワードを使用する必要があります