C++转置嵌套vector时调用absolute_error模板函数出现类型错误
问题原因
- 你当前定义的
absolute_error模板要求传入的两个std::vector的元素类型完全一致,但是你调用时传入的两个参数类型不匹配:ana_direct[i]的类型是std::vector<Dune::FieldVector<double, 3>>,元素是3维场向量num_direct的类型是std::vector<double>,元素是标量浮点数
编译器无法推导出统一的模板参数T,因此直接报错。
解决方案
首先结合你贴的运行输出确认业务逻辑:数值解输出15个单值,解析解输出5组3维向量,刚好对应15个分量,本质是解析解的向量没有展开为标量序列,和数值解结构不匹配。你可以根据实际需求选择以下两种修复方案:
方案1:预处理解析解为标量数组,对齐数值解的类型
不需要修改原有absolute_error模板,只需要在调用误差计算前把解析解的3维向量展开为标量数组即可:
// 在循环内调用absolute_error前添加转换代码 std::vector<double> ana_scalar; ana_scalar.reserve(ana_direct[i].size() * 3); for(const auto& vec : ana_direct[i]) { ana_scalar.push_back(vec[0]); ana_scalar.push_back(vec[1]); ana_scalar.push_back(vec[2]); } // 现在传入两个类型一致的vector<double>即可正常调用 absoluteErrors.push_back(absolute_error(ana_scalar, num_direct));
方案2:修改模板支持两种不同元素类型
如果后续需要频繁处理不同类型的向量/标量误差计算,可以直接修改模板适配不同输入类型,返回值统一为double:
#include <stdexcept> #include <cmath> template <class T1, class T2> double absolute_error(const std::vector<T1>& num, const std::vector<T2>& ana) { if(num.size() != ana.size()) { throw std::runtime_error("vector size mismatch when calculating absolute error"); } double error = 0.0; for(size_t i=0; i<num.size(); ++i) { // 可根据业务调整计算逻辑,示例为自动转double后算差 double diff = static_cast<double>(num[i]) - static_cast<double>(ana[i]); error += diff * diff; } return std::sqrt(error); }
内容的提问来源于stack exchange,提问作者Otrbit
相关产品推荐
相关产品推荐

