我试图使用这个功能:
bool pcl::visualization::PCLVisualizer::addPointCloud(const pcl::PointCloud<pcl::PointXYZ >::ConstPtr & cloud,
const std::string & id = "cloud",
int viewport = 0
)
所以我将以下代码作为全局变量:
pcl::PointCloud<pcl::PointXYZ> linaccpc;
const pcl::PointCloud<pcl::PointXYZ> * linptr = &linaccpc;
boost::shared_ptr<pcl::visualization::PCLVisualizer> linplotter (new pcl::visualization::PCLVisualizer("linear acceleration");
然后在我的主要功能中:
linplotter->addPointCloud<pcl::PointXYZ> (linptr, "linear acc", 0);
我收到错误:
error: no matching function for call to 'pcl::visualization::PCLVisualizer::addPointCloud(const pcl::PointCloud<pcl::PointXYZ>*&, const char [11], int)'
linplotter->addPointCloud<pcl::PointXYZ> (linptr, "linear acc", 0);
^
非常感谢任何帮助。
答案 0 :(得分:3)
更仔细地看一下addPointCloud()
的定义:
bool pcl::visualization::PCLVisualizer::addPointCloud(
const pcl::PointCloud<pcl::PointXYZ >::ConstPtr & cloud,
const std::string & id = "cloud",
int viewport = 0
)
其第一个参数是对const
的{{1}}引用,其中pcl::PointCloud<pcl::PointXYZ>::ConstPtr
是ConstPtr
的typedef。
您正试图传递boost::shared_ptr<const PointCloud<pcl::PointXYZ>>
,其中pcl::PointCloud<pcl::PointXYZ>*
是预期的。这与定义不符。
boost::shared_ptr<const PointCloud<pcl::PointXYZ>>
有一个boost::shared_ptr
构造函数用于单值输入,因此编译器无法为explicit
值隐式创建临时boost::shared_ptr<const PointCloud<pcl::PointXYZ>>
。
要解决这个问题,你必须直接调用显式构造函数:
pcl::PointCloud<pcl::PointXYZ>*
或者:
pcl::PointCloud<pcl::PointXYZ> linaccpc;
const pcl::PointCloud<pcl::PointXYZ> *linptr = &linaccpc;
...
linplotter->addPointCloud<pcl::PointXYZ> (pcl::PointCloud<pcl::PointXYZ>::ConstPtr(linptr), "linear acc", 0);
但请注意,这可能会导致代码崩溃。默认情况下,pcl::PointCloud<pcl::PointXYZ> linaccpc;
pcl::PointCloud<pcl::PointXYZ>::ConstPtr linptr (&linaccpc);
...
linplotter->addPointCloud<pcl::PointXYZ> (linptr, "linear acc", 0);
会在您提供的任何指针上调用shared_ptr
,因此它会在没有业务释放的内存地址上调用delete
。因此,请使用delete
来分配指针:
new
如果你想绕过那个以及你控制其生命周期的变量,但是pcl::PointCloud<pcl::PointXYZ>::ConstPtr linptr (new pcl::PointCloud<pcl::PointXYZ>);
...
linplotter->addPointCloud<pcl::PointXYZ> (linptr, "linear acc", 0);
只是一个指针,你将不得不提供一个不会释放变量内存的自定义shared_ptr
当deleter
使用指针完成时:
shared_ptr
这最后一种方法只有在template <class T>
static void DoNotFree(T*)
{
}
...
pcl::PointCloud<pcl::PointXYZ> linaccpc;
pcl::PointCloud<pcl::PointXYZ>::ConstPtr linptr (&linaccpc, &DoNotFree<pcl::PointCloud<pcl::PointXYZ>>);
...
linplotter->addPointCloud<pcl::PointXYZ> (linptr, "linear acc", 0);
不需要在linplotter
变量超出范围后继续使用时才会起作用,例如linaccpc
在linplotter
之前被销毁}。不过,这不是你应该依赖的。 lineaccpc
的主要目的是为您管理对象的生命周期,所以让它完成它的工作。使用shared_ptr
。