【问题标题】:Class with std::map object and deleted copy assignment and constructor causes C2280 with std::pair's copy constructor带有 std::map 对象的类和已删除的复制赋值和构造函数导致 C2280 带有 std::pair 的复制构造函数
【发布时间】:2020-08-17 21:17:04
【问题描述】:

在向其添加序列化类后,我正在尝试构建我的 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&lt;const _Kty,_Ty&gt;::pair(const std::pair&lt;const _Kty,_Ty&gt; &amp;)': attempting to reference a deleted function。错误日志说错误是由VariablesSerializableValue 类中的Serializable::Variables value 声明引起的。尽管我明确删除了类中的复制构造函数和赋值,但我不知道是什么原因造成的。

我尝试转换此代码以使其使用 PIMPL,但它只是将错误移至声明和定义实现类的 .cpp 文件中。我不知道如何解决这个问题。非常感谢任何建议。

【问题讨论】:

  • 显示minimal reproducible example 以及所有错误消息的完整文本。不要用散文来描述它们。
  • 您应该发布一个最小可重现示例。没有它,你只会得到反对票。

标签: c++ c++11 visual-c++ dll


【解决方案1】:

std 对构造函数的错误是由调用复制构造函数的映射操作引起的,例如 std::map::insert。对 insert 的调用将不起作用,因为无法复制 unique_ptr,因此编译器会抱怨已删除的构造函数。相反,您必须在调用 insert 时将 unique_ptr 移动到映射中,或者使用 std::map::emplace 构造指针。

希望有所帮助 - 如果没有,一个可重复的小例子就像其他人所说的那样,我主要是在猜测 :)

【讨论】:

    猜你喜欢
    • 2016-05-04
    • 2022-01-22
    • 2015-08-21
    • 2012-11-03
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多