需要'template <>'语法->通过函数调用类模板

时间:2018-06-25 10:49:31

标签: c++

我有一个标题类,如下所示:

#ifndef A_H__
#define A_H__

using namespace pcl::tracking;

namespace ball_tracking_cloud
{

template <typename PointType>
class OpenNISegmentTracking
{
public:
  //...

protected:
   void update(const sensor_msgs::PointCloud2ConstPtr &input_cloud);

  }; // end of class

} // end namespace

#endif

现在我有一个.cpp文件,如下所示:

#include <ball_tracking_cloud/particle_detector.h>

bool init = true;


namespace ball_tracking_cloud
{
void OpenNISegmentTracking<pcl::PointXYZRGBA>::update(const sensor_msgs::PointCloud2ConstPtr &input_cloud)
{
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::fromROSMsg(*input_cloud, *cloud);

    if(init)
    {
        v.run ();
        init=false;
    }

   v.cloud_cb(cloud);
}

} // end of namespace

如果我编译代码,则会出现此错误:

: error: specializing member ‘ball_tracking_cloud::OpenNISegmentTracking<pcl::PointXYZRGBA>::update’ requires ‘template<>’ syntax
 void OpenNISegmentTracking<pcl::PointXYZRGBA>::update(const sensor_msgs::PointCloud2ConstPtr &input_cloud)
      ^
/hri/localdisk/markus/ros-alex/src/ball_tracking/ball_tracking_cloud/src/particle_detector.cpp:38:1: error: expected ‘}’ at end of input
 } // end of namespace
 ^

我不确定为什么会收到此错误.....我想这与我使用模板类...有关,但是我不确定。...< / p>

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:2)

您的OpenNISegmentTrackingc++来说就是full template specialization

换句话说,这是仅当template参数为pcl::PointXYZRGBA时才会被调用的模板版本。

这种定义的正确语法是

template <>
void OpenNISegmentTracking<pcl::PointXYZRGBA>::update(const sensor_msgs::PointCloud2ConstPtr &input_cloud)
{
    ...
}

答案 1 :(得分:1)

函数名称需要以下语法:

template<>
void OpenNISegmentTracking<pcl::PointXYZRGBA>::update(const sensor_msgs::PointCloud2ConstPtr &input_cloud)
{
    // ...
}