如何将任意维度Eigen张量传入函数?模板参数匹配报错如何解决?
错误原因
- 核心原因是
Eigen::Tensor的第二个非类型模板参数(维度数)的原生类型为int,你在定义loss模板时将维度参数N的类型声明为std::size_t(无符号长整型),两者类型不匹配导致模板推导失败,编译器找不到符合参数类型的模板实例。 - 额外注意你当前的代码缺少Eigen张量的头文件引入,即使修复类型问题也会编译报错。
修复方案
修改loss.h代码如下即可正常编译运行:
#include <iostream> // 补全Eigen张量依赖头文件 #include <unsupported/Eigen/CXX11/Tensor> namespace Loss { // 将维度参数N的类型从std::size_t改为int,和Eigen::Tensor的参数类型对齐 template<class T, int N> void loss(Eigen::Tensor<T, N, 0>& predicted, Eigen::Tensor<T, N, 0>& actual) { std::cout << "Loss::loss() not implemented" << std::endl; }; };
优化建议
- 如果需要支持传入只读张量,可以将函数参数改为常量引用
const Eigen::Tensor<T, N, 0>&,适配更多调用场景。 - 当前模板已经自动实现了维度匹配校验:如果两个入参张量的维度数不同,模板会直接推导失败,符合你的需求。
内容的提问来源于stack exchange,提问作者user16836339
相关产品推荐
相关产品推荐

