【问题标题】:accessing templated member function of an object that is a member of a struct访问作为结构成员的对象的模板化成员函数
【发布时间】:2013-01-14 05:14:44
【问题描述】:

所以我有一个包含许多成员的结构,包括一个指向 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 '&gt;' token

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

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

感谢任何帮助

【问题讨论】:

  • 这是一个非常糟糕的简单案例测试...您是否尝试使用gt_data 作为类型,或者您是否也有一个名为gt_data 的变量? gt_data.output是怎么声明的,是static吗? gt_data 是模板还是依赖于模板参数?您应该准备一个简单的最小测试用例来重现问题并发布...
  • @K-ballo 感谢您指出我的问题。我做了一些改变。我希望这可以澄清事情。
  • 它没有说明PointType 的来源,也没有说明foo 依赖于它......(因为我的回答解决了你的问题,我可以猜出这些,但我不应该必须猜出你的问题是什么)
  • 现在问题显示了足够的上下文来实际回答!

标签: c++ templates struct shared-ptr


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢,这是我的问题。我只是想知道为什么当我从调用中删除结构时编译器可以消除模板和比较之间的歧义,但当我将结构添加到调用时却不能?
  • @Mustafa:因为还有一些你没有给我们看的东西......那里有一个模板
  • @Mustafa:现在您已经更新了问题,typename 和 template 仅在依赖于模板参数时才需要。否则,如果编译器事先知道类型,它实际上可以查看您所指的是变量、类型还是函数。
  • 好的,所以我再次编辑它以表明我显示的代码实际上是模板类的一部分。那么树成员是什么导致结构依赖于模板参数?
  • @Mustafa:不,结构体的实际类型是template&lt; typename PointType &gt; struct A&lt; PointType &gt;::gt_data_type,你可以清楚地看到它依赖于模板参数PointType。
【解决方案2】:

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

【讨论】:

  • 推测他有一个名为 gt_data 的变量,因为第二个示例在执行 gt_data.output 时编译得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 2016-11-14
相关资源
最近更新 更多