24

私は以下のようなクラスを持っています:

//.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

私は何をすべきか?

4

3 に答える 3

36

__declspec(dllimport)現在のコードがクラスを実装する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を使用するアプリケーションの間でヘッダーを共有できることを意味します。

于 2010-08-16T09:58:50.973 に答える
6

MSDNドキュメントから、

クラスdllimportを宣言すると、そのすべてのメンバー関数と静的データメンバーがインポートされます。非クラス型でのdllimportおよびdllexportの動作とは異なり、静的データメンバーは、dllimportクラスが定義されているのと同じプログラムで定義を指定することはできません

それが役に立てば幸い..

于 2010-08-16T09:45:27.203 に答える
0

クラスをインポートする場合は、すべてのメンバーとともにインポートするため、「クライアント側」でクラスメンバーを定義することはできません。dllexportキーワードは、実装dllに代わって使用する必要があります

于 2010-08-16T09:44:41.637 に答える