0

所以我有一个包含许多成员的结构,包括一个指向 PCLVisualizer 对象的 boost 共享指针。PCLVisualizer 类是具有成员函数 updatePointcloud 的模板类。我正在尝试为模板 PointType 调用 updatePointCloud。请看下面的代码:

template <typename PointType>
class A {
    struct gt_data_type {
        model_struct line;
        PointCloudTPtr input;
        PointCloudTPtr output;
        int step_size;
        int segment_min_pts;
        vector<float> directions;
        float current_direction;
        vector<line_segment> seeds;
        Eigen::Vector4f prev_vector;
        Eigen::Vector4f current_vector;
        Eigen::Vector4f p;
        typename pcl::search::KdTree<PointType>::Ptr tree;
        pcl::visualization::PCLVisualizer::Ptr viewer;
        line_segment prev_segment;

    };

    gt_data_type gt_data;


    void foo(PointCloudTPtr output) {
        pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Track Viewer"));
        gt_data.output = output;
        gt_data.viewer = viewer;
        // next line causes compile error
        gt_data.viewer->updatePointCloud<PointType>(gt_data.output,"rail");
    }

}

请注意,PointCloudTPtr 只是不同 shared_ptr 的 typedef。我在指示的行收到以下错误: expected primary-expression before '>' token

如果我省略结构并通过这样做直接调用查看器成员函数: viewer->updatePointCloud<PointType>(gt_data.output,"rail");

我的代码编译。我不明白为什么通过结构访问查看器会有什么不同。

任何帮助表示赞赏

4

2 回答 2

2

您发布的示例应该可以正常工作。除非您实际上打算调用viewer类型而不是变量。但是,如果gl_data它本身是模板或依赖于模板参数,那么编译器将不知道您是在编写函数调用还是比较表达式。从您的代码的外观来看,它似乎依赖于模板参数PointType

正如typename需要在类型和变量之间template消除歧义一样,需要在模板和比较之间消除歧义:

data.viewer->template updatePointCloud<PointType>(data.output,"rail");
于 2013-01-12T00:00:31.347 回答
1

您需要一个对象类型gt_data,而不是直接使用类的名称。

于 2013-01-12T00:00:31.817 回答