簡體   English   中英

Class 與 std::map object 和刪除的復制分配和構造函數導致 C2280 與 std::pair 的復制構造函數

[英]Class with std::map object and deleted copy assignment and constructor causes C2280 with std::pair's copy constructor

在向其添加序列化類之后,我正在嘗試構建我的 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 是多態抽象 class (代碼省略,無關)。 Serializable::Variables 定義如下:

class GLOWE_DLLEXPORT Serializable
{
public:
    using Variables = Map<String, UniquePtr<Hidden::SerializableValueBase>>;
    ...

String是一個不可拋出可移動的字符串 class, UniquePtr只是一個使用std::unique_ptr的模板。 Map是使用std::map和我自己的 memory 分配器提供的模板。

當我嘗試編譯此代碼時,我收到error C2280: 'std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)': attempting to reference a deleted function 錯誤日志說該錯誤是由VariablesSerializableValue class 中的Serializable::Variables value聲明引起的。 盡管我明確刪除了 class 中的復制構造函數和賦值,但我不知道是什么原因造成的。

我嘗試轉換此代碼以使其使用 PIMPL,但它只是將錯誤移至聲明和定義實現 class 的 .cpp 文件。 我不知道如何解決這個問題。 非常感謝任何建議。

std 對構造函數的錯誤是由調用復制構造函數的 map 操作引起的,例如 std::map::insert。 對 insert 的調用將不起作用,因為無法復制 unique_ptr,因此編譯器會抱怨已刪除的構造函數。 相反,當您調用 insert 時,您必須將 unique_ptr 移動到 map 中,或者使用 std::map::emplace 構造指針。

希望有所幫助 - 如果沒有,一個小的可重復的例子是 go 正如其他人所說的那樣,我主要是在猜測:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM