带有std::map对象的类,删除了复制赋值和构造函数,导致带有std::pair的复制构造函数C2280。

问题描述 投票:0回答:1

我试图在我的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文件中。我不知道如何解决这个问题。任何建议都是非常感激的。

c++ c++11 visual-c++ dll
1个回答
0
投票

std对构造函数的错误是由调用复制构造函数的map操作引起的,比如std::map::insert。调用insert是行不通的,因为不能复制一个unique_ptr,所以编译器会抱怨一个被删除的构造函数。取而代之的是,当你调用insert时,你必须将unique_ptr移动到map中,或者使用std::map::emplace在原地构造指针。

希望这对你有帮助--如果没有,就像其他人说的那样,一个小的可重现的例子是最好的方法,我主要是在猜测:)

© www.soinside.com 2019 - 2024. All rights reserved.