私はlibのコードをいくつか書いていて、すべてを実行するためにデフォルトのWin32コンソールアプリケーションを試しました。すべてのクラスを完了したので、すべてをDLLに抽出したかったので、通常のマクロで適応を開始しました。
#ifdef MYLIB_EXPORTS
#define DllExport __declspec(dllexport)
#else
#define DllExport __declspec(dllimport)
#endif
私は次のように定義されたコードで1つのインターフェースを使用しています:
__interface DllExport ISerializable {
void Serialize(/* ... */);
/* some other methods */
};
そして、これは私のexeファイルでこのコードを与えている間は機能しました。DLLで、コンパイル中に次のようなエラーが発生します
error C2039: '=' : is not a member of 'MyLib::ISerializable'
error C2664: 'MyLib::DerivedClass::operator =' : cannot convert parameter 1 from 'const MyLib::ISerializable' to 'const MyLib::DerivedClass &'
ISerializable
必要なメソッドを実装するために継承するすべてのクラスに対して。(std::shared_ptr<ISerializable>
コードを抽象化するために数回使用しています。)ただし、に変更__interface
しclass
てすべてのメソッドを純粋な仮想にする場合、このエラーは発生せず、コンパイルは成功します。
なぜこのエラーが発生するのですか?DLLのクラス/インターフェイスに代入演算子が必要なのはなぜですか?回避策はありますか?
(C++11を使用するWindows8RTMでVisualStudio2012 RTMを使用します。)
このエラーが発生する1つのセグメントを次に示します(エラーは常に}
クラスの最後を指します)。
class DllExport Tile final : public ISerializable {
public:
__declspec(property(get=GetIsPassable, put=SetIsPassable))
bool IsPassable;
__declspec(property(get=GetTileId, put=SetTileId))
uint16_t TileId;
bool& GetIsPassable() { return this->_IsPassable; }
void SetIsPassable(bool val) { this->_IsPassable = val; }
uint16_t& GetTileId() { return this->_TileId; }
void SetTileId(uint16_t val) { this->_TileId = val; }
bool _IsPassable;
uint16_t _TileId;
void Serialize(OutputFileStream& ofs);
size_t TellSize();
size_t Unserialize(InputFileStream& ifs, size_t metadata = 0);
};
Tile
このエラーは、を使用するクラスのように、プロパティがあるクラスでも発生しますstd::shared_ptr<ISerializable>
。