![](/img/trans.png)
[英]Error C2280 / Problem with Copy Constructor while instantiating an Object in std::vector?
[英]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.