0

したがって、PCLVisualizer オブジェクトへのブースト共有ポインターを含む多くのメンバーを保持する構造があります。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

投稿したサンプルは正常に動作するはずです。variable の代わりに typeを実際に呼び出すつもりでない限り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 に答える