- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在为库编写一些代码,并尝试使用默认的 Win32 控制台应用程序来运行所有内容。因为我已经完成了所有类(class),所以我想将所有内容提取到一个 DLL 中,因此我开始使用通常的宏进行改编:
#ifdef MYLIB_EXPORTS
#define DllExport __declspec(dllexport)
#else
#define DllExport __declspec(dllimport)
#endif
我在我的代码中使用一个接口(interface),它是这样定义的:
__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 中的类/接口(interface)需要赋值运算符?有什么解决方法吗?
(在带有 C++11 的 Windows 8 RTM 上使用 Visual Studio 2012 RTM。)
这是发生此错误的一个片段(错误指向类的最后一个 }
):
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>
的类(class).
最佳答案
我猜接口(interface)没有编译器生成的复制构造函数或赋值运算符。
一种可能的解决方案是显式实现 DerivedClass::operator=
。那是因为编译器生成的版本将尝试调用不存在的 ISerializable::operator=
。复制构造函数也是如此。
另一种解决方案是将所有类都设为 COM 类:)
示例
使用您的 Tile 类:
class DllExport Tile final : public ISerializable {
public:
Tile(const Tile& tile) :
_IsPassable(tile._IsPassable), _TileId(tile._TileId)
{
}
/* New Code START */
Tile& operator=(const Tile& tile)
{
_IsPassable = tile._IsPassable;
_TileId = tile._TileId;
return *this;
}
/* New Code END */
__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);
};
关于c++ - Operator = 不是 DLL 中导出的 C++ __interface 的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12450760/
看完这篇文章:Using Interfaces in C++ 我已决定将 __interface 关键字与一个宏一起使用,该宏将添加上面链接中所述的虚拟析构函数。 我很高兴 __interface 关
我一直在为库编写一些代码,并尝试使用默认的 Win32 控制台应用程序来运行所有内容。因为我已经完成了所有类(class),所以我想将所有内容提取到一个 DLL 中,因此我开始使用通常的宏进行改编:
我是一名优秀的程序员,十分优秀!