模板化构造函数,预期的括号

时间:2014-03-10 14:41:29

标签: c++ templates

我有一个班级模板:

template <class T>
class NormalEstimator
{
    public:
        NormalEstimator(pcl::PointCloud<T>::Ptr cloud) : _cloud(cloud) {}

        void computeNormals();
        pcl::PointCloud<pcl::Normal>::Ptr getNormals();
    private:
        typename pcl::PointCloud<T>::Ptr _cloud;
        pcl::PointCloud<pcl::Normal>::Ptr _normals;

        int _kNeighbours;
};

成员函数也在头文件中声明。编译时,这给了我错误:

.../normal_estimator.h:12: error: expected ')' before 'cloud'

我忘记了什么吗?我是否需要以某种方式或形式在构造函数上指定'typename'?

3 个答案:

答案 0 :(得分:1)

这是一个从属名称。类型::Ptr依赖于T.所以你必须使用“typename”告诉编译器::Ptr的值是一个类型。

 NormalEstimator(typename pcl::PointCloud<T>::Ptr cloud) 

这是因为只要定义了T,:: Ptr的类型可能是任何东西(静态成员/类型/静态函数)。

http://en.cppreference.com/w/cpp/language/dependent_name

答案 1 :(得分:0)

你试过这个吗?

NormalEstimator(typename pcl::PointCloud<T>::Ptr cloud) : _cloud(cloud) {}

答案 2 :(得分:0)

是的,构造函数参数中也需要typename因为T是一个依赖类型:

NormalEstimator(typename pcl::PointCloud<T>::Ptr cloud)
//              ^^^^^^^^