2016-11-11 1 views
0

포인트 유형에 관계없이 템플릿 클래스를 사용하여 내 기능을 사용하려고합니다. 나는 "Writing a new PCL class"튜토리얼을 읽었지만 그것을 얻지 못했습니다. 이 기술을 사용하려고하는 가장 간단한 수업을 나눌 것입니다. 그것의 유일한 기능은 프로세스의 부모 트리 실행의 올바른 지점에 포인트 클라우드의 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 답안 @의 W.F에 대한

#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

먼저 템플릿을 처리 할 때 모든 구현을 헤더 파일로 이동해야한다는 것을 받아 들여야합니다. PointCloud 클래스는 모든 클래스를 받아 들일 준비가

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

경우 XYZ는 당신이 당신을 변경해야 할 좌표 : 방금 적절한 템플릿 선언 구문을 추가 할 필요가 매개 변수에 점의 클래스를 취하는 템플릿으로 KdtreeBuilder_Process를 원하는 경우 이에 따라 코드

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

감사 : 여기에만 헤더 파일을 사용하여 최종 솔루션입니다. 간단한 것처럼 보이지만 생성자 매개 변수에 문제가 있습니다. boosted 공유 포인터를 템플릿 기반 클래스의 생성자에 포함시킬 수 있습니까? 오류가 있습니다 "C2061 : 구문 오류 : 식별자 'Ptr'" –

관련 문제