std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();
link->GetGeometries()
的类型为std::vector<boost::shared_ptr<Geometry>>
我用上面的代码得到了以下错误。
error: conversion from ‘const std::vector<boost::shared_ptr<OpenRAVE::KinBody::Link::Geometry> >’ to non-scalar type ‘std::list<OpenRAVE::KinBody::Link::Geometry>’ requested
std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();
我该怎么办?
答案 0 :(得分:7)
std::list<KinBody::Link::Geometry> geometries;
for (auto const & p : link->GetGeometries())
geometries.push_back(*p);
对于for (auto const & p : ...)
部分,您需要启用C ++ 11支持(它使用自动类型推导和基于范围的for循环)。
Pre-C ++ 11等价物是
std::list<KinBody::Link::Geometry> geometries;
typedef std::vector<boost::shared_ptr<KinBody::Link::Geometry>> geometries_vector_t;
geometries_vector_t const & g = link->GetGeometries();
for (geometries_vector_t::const_iterator i = g.begin(); i != g.end(); ++i)
geometries.push_back(**i); // dereferencing twice: once for iterator, once for pointer
注意:这一切看起来都很不自然。作为共享指针返回的对象意味着KinBody::Link::Geometry
实际上是基类或接口,或者此类型的对象很大,并且接口旨在避免大量复制或其他内容。我建议不要复制对象并将它们存储为界面建议的共享指针,除非你确实知道你需要副本。
答案 1 :(得分:4)
既然你提到了提升,那就告诉我一些Boost Range糖吧。
integral(g,-10,10,'arrayvalued',true);
这将导致包含link->getgeometries() | adaptors::indirected
元素的范围。使用Geometry&
copy_range
查看完整的演示版:
<强> Live On Coliru 强>
geometries = boost::copy_range<std::list<link::geometry>>(
link->getgeometries() | adaptors::indirected
);
答案 2 :(得分:-1)
该行
std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();
尝试将矢量指定给列表。编译器告诉您不能这样做。你要做的是迭代向量并将每个元素插入列表。
请注意,向量包含指向几何的共享指针,而列表声明为包含实例。如果要在列表中存储指针,则必须将其声明为:
std::list<KinBody::Link::Geometry*> // note the *