我试图在我的dll库中添加序列化类后建立我的dll库。我有这样的代码。
class VariablesSerializableValue
: public SerializableValueBase
{
private:
Serializable::Variables value;
public:
VariablesSerializableValue() = default;
VariablesSerializableValue(const VariablesSerializableValue&) = delete;
VariablesSerializableValue(_In_ Serializable::Variables&& arg) noexcept;
VariablesSerializableValue& operator=(const VariablesSerializableValue&) = delete;
VariablesSerializableValue& operator=(_In_ Serializable::Variables&& arg) noexcept;
const Serializable::Variables& getValue() const;
void add(_In_ const String& name, _In_ UniquePtr<SerializableValueBase>&& arg);
virtual UniquePtr<SerializableValueBase> clone() const override;
};
其中SerializableValueBase是一个多态的抽象类(代码省略,无关紧要).Serializable::Variables定义如下。
class GLOWE_DLLEXPORT Serializable
{
public:
using Variables = Map<String, UniquePtr<Hidden::SerializableValueBase>>;
...
String
是一个不抛出可移动的字符串类。UniquePtr
只是一个模板,使用的是 std::unique_ptr
. Map
是一个模板使用的 std::map
并提供了我自己的内存分配器。
当我试着编译这段代码时,我得到的是 error C2280: 'std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)': attempting to reference a deleted function
. 错误日志说,该错误是由以下原因引起的 Serializable::Variables value
声明中 VariablesSerializableValue
类。我不知道是什么原因造成的,虽然我明确删除了类中的复制构造函数和赋值。
我试着将这段代码转换为使用PIMPL,但它只是将错误移到了实现类被声明和定义的.cpp文件中。我不知道如何解决这个问题。任何建议都是非常感激的。
std对构造函数的错误是由调用复制构造函数的map操作引起的,比如std::map::insert。调用insert是行不通的,因为不能复制一个unique_ptr,所以编译器会抱怨一个被删除的构造函数。取而代之的是,当你调用insert时,你必须将unique_ptr移动到map中,或者使用std::map::emplace在原地构造指针。
希望这对你有帮助--如果没有,就像其他人说的那样,一个小的可重现的例子是最好的方法,我主要是在猜测:)