C ++类跟随template关键字

时间:2017-07-19 07:24:57

标签: c++ c++11

我正在编译一个使用C ++数学库Eigen3的C ++库。但是,以下代码在使用VC2013进行编译时会引入一些语法错误:

template <typename Derived>
    inline Eigen::Transform<typename Derived::Scalar, 3, Eigen::Isometry> v2t(const Eigen::MatrixBase<Derived>& x_) {
    Eigen::Transform<typename Derived::Scalar, 3, Eigen::Isometry> X;
    Eigen::Matrix<typename Derived::Scalar, 6, 1> x(x_);
    X.template linear() = quat2mat(x.template block<3,1>(3,0));
    X.template translation() = x.template block<3,1>(0,0);
    return X;
  }

错误消息如下:

Error   C2059   syntax error : 'template'    
Error   C2039   'X' : is not a member of 'Eigen::Transform<float,3,1,0>'        
Error   C2059   syntax error : 'template'    
Error   C2039   'X' : is not a member of 'Eigen::Transform<float,3,1,0>'    

我从未见过X.template这样的代码,所以我不知道如何纠正这个编译错误。有任何想法吗?

1 个答案:

答案 0 :(得分:3)

此处应使用template关键字来消除模板与比较运算符之间的歧义,例如:

struct X {
    template <int A>
    void f();
};

template <class T>
void g() {
    T t{};
    t.f<4>(); // Error - Do you want to compare t.f with 4 
              // or do you want to call the template t.f ?
}

您需要t.template f<4>()至&#34;消除歧义&#34;。您使用的库的问题是Eigen::Transform<...>::linear不是模板成员函数,因此此处不需要template关键字,也不应该使用(我认为)。

  

[temps.name#5]

     

以关键字template为前缀的名称应为 template-id ,或者名称应引用类模板。 [注意:关键字template可能不适用于类模板的非模板成员。 -结束   注意] [...]

MSVC是正确的,Eigen::Transform<...>::linear是类模板的非模板成员,因此不应应用template关键字。标准中的以下示例应该是格式错误的,但与gcc和clang编译得非常好:

template <class T> struct A {
    void f(int);
    template <class U> void f(U);
};

template <class T> void f(T t) {
    A<T> a;
    a.template f<>(t); // OK: calls template
    a.template f(t); // error: not a template-id
}

关于您在github上使用的库已经有一个未解决的问题,但没有作者的任何答案......您可以自己更新标题(ncip/bm_se3.h)或分叉项目并在github上发出一个pull-request。