[英]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.