模板参数能否依赖其他模板参数?附C++代码示例
解决Eigen类型的模板特化参数不匹配问题
兄弟,我一看你这段代码就发现核心问题了——模板特化的类型和成员函数的参数类型完全不匹配,这肯定过不了编译!
先把你的代码贴出来方便分析:
template<unsigned int rows, unsigned int cols,typename arrtype> class Variance { double f(const arrtype &); }; template<unsigned int rows, unsigned int cols> double Variance<rows,cols,Eigen::Matrix<double,rows,cols>> ::f(const Eigen::Array<double,rows,cols> & M) { //do stuff }
问题拆解
你特意为arrtype = Eigen::Matrix<double, rows, cols>做了类模板特化,但成员函数f的参数却写成了Eigen::Array<double, rows, cols>,这和类模板里声明的const arrtype &完全不一致,编译器会认为你这是在声明一个全新的函数,而不是特化原模板里的f。
两种修复方案
方案1:特化针对Matrix,参数也用Matrix
如果你本来就是想处理Eigen的Matrix类型,那把函数参数改成对应的Matrix类型就行:
template<unsigned int rows, unsigned int cols> double Variance<rows,cols,Eigen::Matrix<double,rows,cols>>::f(const Eigen::Matrix<double,rows,cols> & M) { // 这里可以用Eigen的API处理Matrix,比如转成Array计算方差 return M.array().var(); }
方案2:特化针对Array,调整模板参数
如果你的目标是处理Eigen的Array类型,那把特化的模板参数换成Array就行:
template<unsigned int rows, unsigned int cols> double Variance<rows,cols,Eigen::Array<double,rows,cols>>::f(const Eigen::Array<double,rows,cols> & M) { // 直接用Array的内置方差计算函数 return M.var(); }
要是你需要同时支持Matrix和Array两种类型,也可以写两个独立的特化版本,或者用更灵活的模板偏特化来统一匹配Eigen的稠密容器类型,不过这属于进阶玩法了,先把基础的类型匹配搞定再说~
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

