2013-01-11 128 views
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");

我的代码编译。我不明白为什么通过结构访问查看器会产生任何影响。

任何帮助表示赞赏

+0

这是一个非常糟糕的简单案例测试......您是否尝试使用'gt_data'作为类型,或者您是否也有一个名为'gt_data'的变量? 'gt_data.output'是如何声明的,是'静态'吗? 'gt_data'是模板还是依赖于模板参数?你应该准备一个简单的最小化测试用例来重现问题并发布... –

+0

@ K-ballo谢谢你指出我的问题。我做了一些改变。我希望这能澄清事情。 – Mustafa

+0

它没有阐明'PointType'来自哪里,也不是'foo'依赖于它......(因为我的答案解决了你的问题,我可以猜出来,但我不应该猜测你的问题是什么) –

回答

2

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

正如typename需要一个类型和一个变量之间的歧义,template需要一个模板,一个比较之间的歧义:

data.viewer->template updatePointCloud<PointType>(data.output,"rail"); 
+0

非常感谢,我的问题。我只是想知道,为什么编译器可以在模板和比较之间消除歧义,当我从调用中移除结构时,但是当我将该结构添加到调用时,它不能? – Mustafa

+0

@Mustafa:因为还有别的东西,你没有向我们展示......有一个模板在那里 –

+0

@Mustafa:现在你已经更新了这个问题,'typename'和'template'只有在有依赖于模板参数。否则,如果编译器事先知道类型,它实际上可以去查看你所指的是变量,类型还是函数。 –

1

你需要一个对象OT型gt_data不是类的名称直。

+0

据推测,他有一个名为'gt_data'的变量,因为第二个示例在执行'gt_data.output'时编译得很好。 –