如何将 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_back
。 emplace_back
将参数转发给类型 std::unique_ptr<segment>
的构造函数。但是 line
类型与 std::unique_ptr<segment>
类型不匹配。
在 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_back
。 emplace_back
将参数转发给类型 std::unique_ptr<segment>
的构造函数。但是 line
类型与 std::unique_ptr<segment>
类型不匹配。