我试图用
声明一个PCL类的对象typedef pcl::PointCloud<PointNT> PointCloudT; // in the .h file.
和
PointCloudT::Ptr object = new PointCloudT(); // in main func
PointCloudT::Ptr scene = new PointCloudT(); // and these two triggers the error of
1&gt; f:\ cpps \ pclrclass \ pclrclass \ main_routine.cpp(10):错误C2440:&#39;初始化&#39; :无法转换为PointCloudT *&#39; to&#39; boost :: shared_ptr&gt;&#39;
但如果声明由
给出,则可行PointCloudT::Ptr object(new PointCloudT); // in main func
PointCloudT::Ptr scene(new PointCloudT); // works and correct
我不擅长C ++而且不知道这个错误的问题是什么。谁能说一点呢。
答案 0 :(得分:0)
new PointCloudT()
表达式生成指向点云的原始指针PointCloudT *
。
PointCloudT::Ptr
是boost::shared_ptr<PointCloudT>
的同义词,是指向点云的智能指针。您可以查看此模板类here的概要。如您所见,它有一个构造函数
template<class Y> explicit shared_ptr(Y * p);
在我们的案例中成为
explicit shared_ptr(PointCloudT * p);
这意味着它可以从指向点云的原始指针构建。注意explicit
keyword,它禁止隐式构造和复制初始化。
这就是为什么第一个代码段会出错(您请求两个不同类之间的隐式转换),第二个代码段工作(您显式调用共享指针的构造函数)。