簡體   English   中英

錯誤:使用已刪除的 function std::unique_ptr

[英]Error: Use of deleted function std::unique_ptr

我正在嘗試將 unique_ptr 傳遞給自定義向量 class 但我收到主題標題中的錯誤。

我知道您無法復制 unique_ptr ,因此我在傳遞它時嘗試使用 std::move() ,但這似乎並不能解決我的問題......我哪里出錯了?

提前致謝

template<typename T>
class VectorSelectable {
public:
    void Add(const T& v) { 
        m_Items.push_back(move(v)); 
    }
private:
    vector<T> m_Items;
};

class FunctionType {
    int m_Data;
};

int main()
{
    VectorSelectable<unique_ptr<FunctionType>> vec;
    vec.Add(move(make_unique<FunctionType>()));
    return 0;
}

編輯:將 'const' 添加到 'Add(const T& v)'

如果你想同時允許 copy-via-const-ref 和 move-via-rvalue-ref,你可以模板化你的Add方法並使用通用轉發引用技術,或者顯式編寫兩個重載:

    void Add(const T& v) { 
        m_Items.push_back(v); 
    }
    void Add(T&& v) { 
        m_Items.push_back(std::move(v)); 
    }

或者

    template <typename U>
    void Add(U&& v) { 
        m_Items.push_back(std::forward<U>(v)); 
    }

Add()接受T的左值引用,但move(make_unique<FunctionType>())返回右值引用,您不能將右值綁定到左值引用。

您可以將Add()轉換為模板 function 並使用轉發引用來接受左值和右值並將它們移動到您的m_Items中。

template<class U>
void Add(U&& v) { 
    m_Items.push_back(move(v)); 
}

演示。

@Max Peglar-Willis這里的問題是,在某個地方,您的代碼正試圖調用“復制分配”運算符。

這會導致編譯器嘗試生成一個復制賦值操作符,該操作符調用所有子對象的復制賦值操作符。 最終,這導致嘗試復制 unique_ptr,

不可能的操作。

暫無
暫無

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

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