2016-11-11 1 views
0

Я пытаюсь использовать классы шаблонов для использования своих функций независимо от типа точки. Я прочитал учебник «Написание нового класса PCL», но у меня его нет. Я расскажу о простейшем классе, где я пытаюсь использовать эту технику. Его единственная функция - создать KDtree pointcloud в правильной точке выполнения родительского дерева процессов.Класс templating для обработки 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. Выглядит просто, но у меня проблемы с параметрами конструктора. Невозможно включить форсированные общие указатели в конструктор шаблонного класса? У меня есть ошибка «C2061: синтаксическая ошибка: идентификатор« Ptr » –

Смежные вопросы