如何将 shared_ptr 提供给应将各种数据类型添加到向量的模板函数?

How to feed a shared_ptr to a template function that shall add various data types to a vector?

this question 中建议使用 std::shared_ptr 而不是 std::unique_ptr。但是,将此共享指针提供给我的函数时,我无法完成这项工作:

 std::vector<std::unique_ptr<segment>> v3;

    //VERSION 5:
    auto myLine2 = std::make_shared<Line>(start, end);
    add_segment(v3, myLine2);

这是函数的新实现:

template<typename T1, typename T2>
inline void add_segment(T1 & v, T2& line_or_circle)
{
    v.emplace_back(std::move(line_or_circle));
}

我做错了什么?

您不能将 shared_ptr 中的内容“移动”到 unique_ptr 的实例中。如果可以的话,两个不同的智能指针在释放时试图删除它里面的东西,就会出现各种问题。

相反,只需将向量定义为:

std::vector<std::shared_ptr<segment>> v3;

然后,在那之后你真的不需要移动语义:

template<typename T1, typename T2>
inline void add_segment(T1 & v, T2& line_or_circle)
{
    v.emplace_back(line_or_circle);
}

我不确定您是否愿意分享 Line 的所有权。但我希望您希望有一个包含唯一指针的向量。因此,当您的矢量被销毁时,它会清除所有内容。如果您的矢量,如果您的矢量负责线路的生命周期。检查这个:

template <typename T1, typename T2>
inline void add_segment(T1 &v, std::unique_ptr<T2> line_or_circle)
{
    v.emplace_back(std::move(line_or_circle));
}

struct Line
{
    Line(int s, int e)
    {
        start = s;
        end = e;
    }
    int start;
    int end;
};

int main()
{
    std::vector<std::unique_ptr<Line>> v3;

    auto myLine2 = std::make_unique<Line>(1, 5);
    add_segment(v3, std::move(myLine2));
}

你能 post 至少一条错误消息吗? 或者生成足够的代码,以便轻松重现。

据我所知,我认为您没有正确使用 std::vector::emplace_backemplace_back 将参数转发给类型 std::unique_ptr<segment> 的构造函数。但是 line 类型与 std::unique_ptr<segment> 类型不匹配。