2014-10-02 190 views
0

我正在尝试编写一个函数,它可以从double类型或float类型中选取一个Eigen :: Matrix。此功能彩车正常工作:用模板替换标量失败

Eigen::Matrix<float, 4, 4> foo(const Eigen::Matrix<float, 4, 4> &T) 
{ 
    Eigen::Matrix<float, 4, 4> result; 
    result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose(); 
    return result; 
} 

但是,只要我做 “浮动” 的模板:

template <typename Scalar> 
inline Eigen::Matrix<Scalar, 4, 4> foo(const Eigen::Matrix<Scalar, 4, 4> &T) 
{ 
    Eigen::Matrix<Scalar, 4, 4> result; 
    result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose(); 
    return result; 
} 

我得到这个错误使用gcc 4.9.1在Linux上:

.../utils.hpp: In function 'Eigen::Matrix core::math::foo(const Eigen::Matrix&)': .../utils.hpp:77:47: error: request for member 'transpose' in '(0, 0)', which is of non-class type 'int' result.block<3,3>(0,0) = T.block<3,3>(0,0).transpose();

这里有什么问题?

回答

3

一旦该功能模板几个电话都依赖模板的,所以你必须添加一些template关键字,可以尝试:

template <typename Scalar> 
inline Eigen::Matrix<Scalar, 4, 4> foo(const Eigen::Matrix<Scalar, 4, 4> &T) 
{ 
    Eigen::Matrix<Scalar, 4, 4> result; 
    result.template block<3,3>(0,0) = T.template block<3,3>(0,0).transpose(); 
    return result; 
} 
+0

真棒,这作品!尽管我不确定我是否理解到底发生了什么,以及“模板块”的作用......可以详细解释还是给我一些解释指示? – 2014-10-02 13:01:00

+1

你可以看看[我为什么要把模板和类型名关键字](http://stackoverflow.com/questions/610245/where-and-why -DO-I-有到把最模板和类型名称的关键字) – Jarod42 2014-10-02 13:04:07