函数采用特征::张量 - 模板参数推导失败
Function taking Eigen::Tensor - template argument deduction fails
我正在尝试编写一个以Eigen::Tensor
作为参数的模板化函数。适用于Eigen::Matrix
等的相同方法在这里不起作用。
Eigen 建议使用公共基类编写函数。 https://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html
编译Eigen::Matrix
的最小示例:
#include <Eigen/Dense>
template <typename Derived>
void func(Eigen::MatrixBase<Derived>& a)
{
a *= 2;
}
int main()
{
Eigen::Matrix<int, 2, 2> matrix;
func(matrix);
}
以及不编译的Eigen::Tensor
的最小示例:
#include <unsupported/Eigen/CXX11/Tensor>
template <typename Derived>
void func(Eigen::TensorBase<Derived>& a)
{
a *= 2;
}
int main()
{
Eigen::Tensor<int, 1> tensor;
func(tensor);
}
$ g++ -std=c++11 -I /usr/include/eigen3 eigen_tensor_func.cpp
eigen_tensor_func.cpp: In function ‘int main()’:
eigen_tensor_func.cpp:12:16: error: no matching function for call to ‘func(Eigen::Tensor<int, 1>&)’
func(tensor);
^
eigen_tensor_func.cpp:4:6: note: candidate: ‘template<class Derived> void func(Eigen::TensorBase<Derived>&)’
void func(Eigen::TensorBase<Derived>& a)
^~~~
eigen_tensor_func.cpp:4:6: note: template argument deduction/substitution failed:
eigen_tensor_func.cpp:12:16: note: ‘Eigen::TensorBase<Derived>’ is an ambiguous base class of ‘Eigen::Tensor<int, 1>’
func(tensor);
张量模块离与特征/核心功能完全兼容还很远(当然,这也意味着核心功能的文档不一定适用于张量模块)。
第一个主要区别是TensorBase
采用两个模板参数而不是一个,即您需要编写TensorBase<Derived, Eigen::WriteAccessors>
。此外,某些功能要么根本没有实现,要么TensorBase
没有正确转发它。以下内容适用于当前主干 (2019-04-03):
template <typename Derived>
void func(Eigen::TensorBase<Derived, Eigen::WriteAccessors>& a)
{
// a *= 2; // operator*=(Scalar) not implemented
// a = 2*a; // operator=(...) not implemented/forwarded
a *= a; // ok
a *= 2*a; // ok
a *= 0*a+2; // ok
// a.derived() = 2*a; // derived() is not public
static_cast<Derived&>(a) = a*2; // ok
}
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 为什么模板参数推导失败?
- 嵌套参数包扩展失败
- 模板参数的 C++ 自动模板推导失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 在 g++ 6.2.1 中将参数包转发到 constructor() 失败
- 当变量和参数名称匹配时,移动语义构造失败
- 作为模板参数的成员函数指针在继承的成员函数上失败,如何以及为什么?
- 模板参数推导/替换失败,lambda作为函数指针
- 为什么在 std::transform 中使用函数对象参数失败并且需要 lambda 表达式
- C++模板参数失败,不是从错误派生的
- CreateThread参数失败
- 在CreateProcess中传递命令行参数失败