You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:54:02