2016-11-11 22 views
0

我尝试使用模板类来使用我的函数,而不管点类型如何。我读了“编写一个新的PCL类”教程,但我没有得到它。我将分享我尝试使用这种技术的最简单的课程。它的唯一功能是在进程的父树的正确执行点上创建点云的KD树。使用不同点类型处理pcl :: PointCloud对象的类模板

KdtreeBuilder_Process.h

#ifndef KDTREEBUILDER_PROCESS_H 
#define KDTREEBUILDER_PROCESS_H 
#include "ProcessManager/ProcessConcurrent.h" //Parent class 
#include <pcl/kdtree/kdtree_flann.h> 

class KdtreeBuilder_Process:public ProcessConcurrent 
{ 
public: 
    KdtreeBuilder_Process(pcl::PointCloud<pcl::PointXYZ>::Ptr inputCloud,pcl::KdTree<pcl::PointXYZ>::Ptr cloudKdtree); 
    virtual void run(); //method that executed when the process starts 
private: 

    pcl::PointCloud<pcl::PointXYZ>::Ptr mInputCloud; 
    pcl::KdTree<pcl::PointXYZ>::Ptr mCloudKdtree; 
}; 

#endif // KDTREEBUILDER_PROCESS_H 

KdtreeBuilder_Process.cpp

#include "KdtreeBuilder_Process.h" 

KdtreeBuilder_Process::KdtreeBuilder_Process(pcl::PointCloud<pcl::PointXYZ>::Ptr inputCloud,pcl::KdTree<pcl::PointXYZ>::Ptr cloudKdtree): 
    mInputCloud(inputCloud),mCloudKdtree(cloudKdtree) 
{ 

} 

void KdtreeBuilder_Process::run(){ 
    mCloudKdtree->setInputCloud(mInputCloud); 
} 

我的目的是要能够使用这个类包含XYZ坐标

感谢您的支持任意点的类型。 BR

回答

0

我解决了这个问题。下面是仅使用头文件的最终解决方案:

KdtreeBuilder_Process.h

#ifndef KDTREEBUILDER_PROCESS_H 
#define KDTREEBUILDER_PROCESS_H 
#include "ProcessManager/ProcessConcurrent.h" 
#include "PointDefinitions.h" 
#include <pcl/kdtree/kdtree_flann.h> 
#include <QDebug> 

template<class PointType> 
class KdtreeBuilder_Process:public ProcessConcurrent 
{ 
    typedef typename pcl::PointCloud<PointType>::Ptr PointCloudPtr; 
    typedef typename pcl::KdTree<PointType>::Ptr KdTreePtr; 

public: 

    KdtreeBuilder_Process(PointCloudPtr inputCloud,KdTreePtr cloudKdtree): mInputCloud(inputCloud), mCloudKdtree(cloudKdtree) { } 
     virtual void run(){ 
      mCloudKdtree->setInputCloud(mInputCloud); 
     } 
    private: 

     PointCloudPtr mInputCloud; 
     KdTreePtr mCloudKdtree; 
}; 

#endif // KDTREEBUILDER_PROCESS_H 
0

首先,在处理模板时,您必须接受所有实现都需要移动到头文件。如果你想KdtreeBuilder_Process是一个模板,采用类点的参数,您只需要添加相应的模板声明语法:

template<class PointType> 
class KdtreeBuilder_Process:public ProcessConcurrent 
{ 
public: 

如果PointCloud类是准备接受所有类与XYZ坐标,你只需要改变你的代码

KdtreeBuilder_Process(pcl::PointCloud<PointType>::Ptr inputCloud,pcl::KdTree<PointType>::Ptr cloudKdtree): mInputCloud(inputCloud), mCloudKdtree(cloudKdtree) { } 
    virtual void run(){ 
     mCloudKdtree->setInputCloud(mInputCloud); 
    } 
private: 

    pcl::PointCloud<PointType>::Ptr mInputCloud; 
    pcl::KdTree<PointType>::Ptr mCloudKdtree; 
}; 

祝你好运!

+0

谢谢您的回答@ W.F。看起来很简单,但我有构造函数参数的问题。不可能在模板类的构造函数中包含boost共享指针?我有错误“C2061:语法错误:标识符'Ptr'” –

相关问题