Search code examples
c++point-cloud-libraryvisualizer

PCL visualization error


#ifndef VIEWER_H
#define VIEWER_H

#include <iostream>
#include "../../Spheres/spheres.h"
#include "../../Odometry/odometry.h"
#include "../io/io.h"

#include <limits>
#include <utility>
#include <algorithm>
#include <time.h>

#include <cv.h>
#include <opencv/highgui.h> 
#include <opencv2/core/eigen.hpp>

#include <Eigen/Dense>
#include <Eigen/SVD>
#include <Eigen/LU>
#include <unsupported/Eigen/MatrixFunctions>

#include <boost/thread/thread.hpp>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/common_headers.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/passthrough.h>
#include <pcl/common/transforms.h>
//#include <pcl/registration/icp.h>             // conflict with opencv flann
//#include <pcl/features/normal_3d.h>           // conflict with opencv flann
//#include <pcl/features/integral_image_normal.h>  // conflict with opencv flann

//const double pi = M_PI;
class Viewer{
public:
    pcl::PointCloud<pcl::PointXYZRGB> cloud, globalmap;
    pcl::PointXYZRGB point;
    pcl::PassThrough<pcl::PointXYZRGB> filter_pass_x, filter_pass_y, filter_pass_z;
    pcl::VoxelGrid<pcl::PointXYZRGB> filter_voxel;

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

    void viewgenpcl(Sphere &S, Odometry &Odo);

};

#endif // VIEWER_H

The source of the errror is this line of code:

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
Error: expected identifier before 'new'
Error: expected ',' or '...' before 'new'

I am not sure whether this initialisation is coming from boost or pcl though I've used the same line in other files and it worked. Thanks for any help you could provide.


Solution

  • Before C++11 you could not initialize member variables in place, and then you have to use assignment:

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer =
        boost::make_shared<pcl::visualization::PCLVisualizer>(new pcl::visualization::PCLVisualizer ("3D Viewer"));
    

    Or you could initialize members in a constructor member initialization list:

    class Viewer{
    public:
        ...
    
        boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
    
        ...
    
        Viewer()
        : viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"))
        {}
    };