![](/img/trans.png)
[英]Initializing boost::shared_ptr<std::vector<T>> with boost::shared_ptr<std::list<T>>
[英]How to copy std::vector<boost::shared_ptr<T>> to std::list<T>
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();
我该怎么办 ?
std::list<KinBody::Link::Geometry> geometries;
for (auto const & p : link->GetGeometries())
geometries.push_back(*p);
对于for (auto const & p : ...)
部分,您需要启用C ++ 11支持(它使用自动类型推导和基于范围的for循环)。
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
实际上是基类或接口,或者该类型的对象很大,并且该接口旨在避免大量复制或其他操作。 我建议不要复制对象,也不要像接口所建议的那样将它们存储为共享指针,除非您实际上知道需要复制。
既然您提到了增强功能,那么让我向您展示一些增强范围糖。
link->getgeometries() | adaptors::indirected
这将导致包含Geometry&
元素的范围。 用copy_range
填充列表:
geometries = boost::copy_range<std::list<link::geometry>>(
link->getgeometries() | adaptors::indirected
);
观看完整的演示:
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/make_shared.hpp>
#include <iostream>
namespace KinBody {
struct Link {
struct Geometry {};
std::vector<boost::shared_ptr<Geometry> > GetGeometries() const {
return {};
}
};
}
int main() {
using namespace boost;
using namespace KinBody;
auto link = make_shared<Link>();
auto geometries = boost::copy_range<std::list<Link::Geometry>>(
link->GetGeometries() | adaptors::indirected
);
}
线
std::list<KinBody::Link::Geometry> geometries = link->GetGeometries();
尝试将向量分配给列表。 编译器告诉您您不能这样做。 您要做的是迭代向量并将每个元素插入列表。
请注意,向量包含指向几何的共享指针,而列表被声明为包含实例。 如果要将指针存储在列表中,则必须将其声明为:
std::list<KinBody::Link::Geometry*> // note the *
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.