gpt4 book ai didi

c++ - Const 指针的问题

转载 作者:行者123 更新时间:2023-11-28 00:12:32 25 4
gpt4 key购买 nike

我正在尝试使用该功能:

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

非常感谢任何帮助。

最佳答案

addPointCloud()的定义更仔细:

bool pcl::visualization::PCLVisualizer::addPointCloud(
const pcl::PointCloud<pcl::PointXYZ >::ConstPtr & cloud,
const std::string & id = "cloud",
int viewport = 0
)

它的第一个参数是const引用 pcl::PointCloud<pcl::PointXYZ>::ConstPtr , 其中ConstPtrboost::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>*值(value)。

要解决这个问题,您必须直接调用显式构造函数:

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简单地持有一个指向的指针,你将不得不提供一个自定义的 deletershared_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超出范围后的变量,例如 linplotterlineaccpc 之前被销毁.不过,这不是您应该依赖的东西。 shared_ptr的主要目的是为你管理一个对象的生命周期,所以让它完成它的工作。使用 new .

关于c++ - Const 指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com