看似正确的模板代码出错 - 出了什么问题?

时间:2014-01-01 16:28:43

标签: c++ parsing templates eigen

我正在使用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.

(是否意味着编译器将<解析为“小于”而不是模板参数的开始?)。

关于发生了什么的任何线索?

1 个答案:

答案 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?