运算符=不是DLL中导出的C++__接口的成员
Operator = is not a member of exported C++ __interface in DLL
我一直在为lib编写一些代码,并尝试使用默认的Win32控制台应用程序来运行一切。由于我已经完成了所有的类,我想把所有的东西都提取到DLL中,因此我开始用通常的宏进行改编:
#ifdef MYLIB_EXPORTS
#define DllExport __declspec(dllexport)
#else
#define DllExport __declspec(dllimport)
#endif
我在代码中使用了一个接口,定义如下:
__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 &'
为每个继承CCD_ 1的类实现所需的方法。(我使用了几次std::shared_ptr<ISerializable>
来在代码中进行抽象。)然而,当我将__interface
更改为class
并使所有方法都是纯虚拟的时,我没有得到这个错误,编译成功了。
为什么会出现此错误?为什么DLL中的类/接口需要赋值运算符?有什么变通办法吗
(在带有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);
};
这个错误也发生在我有属性的类中,比如在我使用std::shared_ptr<ISerializable>
的Tile
类中。
我猜接口没有编译器生成的复制构造函数或赋值运算符。
一种可能的解决方案是显式地实现DerivedClass::operator=
。这是因为编译器生成的版本将尝试调用不存在的ISerializable::operator=
。复制构造函数也是如此。
另一个解决方案是使您的所有类COM类:)
示例
使用瓷砖类:
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++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 带有进度表的 curl 多接口程序
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 我可以在具有一个标头和一个接口的 cpp 文件中有多个嵌入吗?
- 类接口,可以创建N个方法
- 类具有相同的接口,但参数的类型不同
- 如何与 Cheerp/js 中的 extern 变量接口?
- 如何使用现代 CMake 安装捆绑的接口依赖项?