我正在使用Eigen模板库来表示矩阵。我对Foo2
类中的编译器错误感到困惑,而Foo1
(未模板化)几乎相同的代码传递正常:
#include<Eigen/Core>
struct Foo1{
static Eigen::Matrix<double,3,1> bar(const Eigen::Matrix<double,6,1>& v6){
return v6.head<3>();
}
};
template<typename Scalar>
struct Foo2{
static Eigen::Matrix<Scalar,3,1> bar(const Eigen::Matrix<Scalar,6,1>& v6){
return v6.head<3>();
}
};
给出(clang 3.4,gcc 4.8):
a.cc:8:53: error: expected expression
static Vec3 bar(const Vec6& v6){ return v6.head<3>(); }
^
1 error generated.
(是否意味着编译器将<
解析为“小于”而不是模板参数的开始?)。
关于发生了什么的任何线索?
答案 0 :(得分:4)
是的,这正是它的含义。您需要告诉编译器head
是模板而不是数据成员:
return v6.template head<3>();
编译器无法判断的原因是因为它不知道v6
的实例化类型是什么(因为它取决于模板参数Scalar
)。
我们今天早些时候a question with the same answer了。有关更深入的说明,请参阅Where and why do I have to put the “template” and “typename” keywords?。