Класс с объектом std :: map и присвоением удаленного копирования и конструктором вызывает C2280 с конструктором копирования std :: pair - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь собрать свою библиотеку 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 является абстрактным классом polymorphi c (код опущен, не имеет значения). 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 где класс реализации был объявлен и определен. Я понятия не имею, как справиться с этим. Любой совет очень ценится.

1 Ответ

0 голосов
/ 03 мая 2020

Ошибка с конструктором пары std вызвана операцией отображения, которая вызывает конструктор копирования, такой как std :: map :: insert. Вызов на вставку не будет работать, потому что нельзя скопировать unique_ptr, поэтому компилятор будет жаловаться на удаленный конструктор. Вместо этого вам нужно будет std :: переместить unique_ptr в карту при вызове insert или создать указатель на месте, используя std :: map :: emplace.

Надеюсь, что это поможет - если нет, то маленький Воспроизводимый пример - это путь к go, как говорили другие, я в основном догадываюсь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...