Error: Use of deleted 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)'

@Max Peglar-Willis 这里的问题是您的代码在某处试图调用“复制赋值”运算符。

这会导致编译器尝试生成一个复制赋值运算符,它调用所有子对象的复制赋值运算符。最终,这会导致尝试复制 unique_ptr、

一个不可能的操作。

Add()接受T的左值引用,但是move(make_unique<FunctionType>())returns接受右值引用,不能将右值绑定到左值引用。

您可以将 Add() 变成模板函数并使用转发引用来接受左值和右值并将它们移动到您的 m_Items.

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

Demo.

如果你想允许通过常量引用复制和通过右值引用移动,你可以模板化你的 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)); 
    }