1

我正在尝试将 unique_ptr 传递给自定义矢量类,但我收到主题标题中的错误。

我知道您无法复制 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)'

4

3 回答 3

2

如果你想同时允许 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)); 
    }
于 2021-12-01T10:54:02.797 回答
1

Add()接受 的左值引用,Tmove(make_unique<FunctionType>())返回右值引用,您不能将右值绑定到左值引用。

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

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

演示。

于 2021-12-01T10:47:14.833 回答
-1

@Max Peglar-Willis 这里的问题是,在某个地方,您的代码正试图调用“复制分配”运算符。

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

不可能的操作。

于 2021-12-01T10:44:19.630 回答