Const指针的麻烦

时间:2015-08-26 20:12:13

标签: c++ pointers parameter-passing

我试图使用这个功能:

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);
                                                                 ^

非常感谢任何帮助。

1 个答案:

答案 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>::ConstPtrConstPtr的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_ptrdeleter使用指针完成时:

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变量超出范围后继续使用时才会起作用,例如linaccpclinplotter之前被销毁}。不过,这不是你应该依赖的。 lineaccpc的主要目的是为您管理对象的生命周期,所以让它完成它的工作。使用shared_ptr