我正在编译一个使用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
这样的代码,所以我不知道如何纠正这个编译错误。有任何想法吗?
答案 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
关键字,也不应该使用(我认为)。
以关键字
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。