C++ 函数采用特征::张量-模板参数推导失败

C++ 函数采用特征::张量-模板参数推导失败,c++,templates,tensor,eigen3,C++,Templates,Tensor,Eigen3,我正在尝试编写一个模板函数,将特征::张量作为参数。适用于Eigen::Matrix等的相同方法在这里不起作用 Eigen建议使用公共基类编写函数 Eigen::Matrix的一个最小示例,它编译: #包括 模板 void func(本征::矩阵基&a) { a*=2; } int main() { 特征::矩阵; func(矩阵); } 对于本征::张量而言,不编译的最小示例: #包括 模板 void func(本征::张量基&a) { a*=2; } int main() { 本征:张量张

我正在尝试编写一个模板函数,将
特征::张量作为参数。适用于
Eigen::Matrix
等的相同方法在这里不起作用

Eigen建议使用公共基类编写函数

Eigen::Matrix
的一个最小示例,它编译:

#包括
模板
void func(本征::矩阵基&a)
{
a*=2;
}
int main()
{
特征::矩阵;
func(矩阵);
}
对于
本征::张量
而言,不编译的最小示例:

#包括
模板
void func(本征::张量基&a)
{
a*=2;
}
int main()
{
本征:张量张量;
func(张量);
}
$g++-std=c++11-I/usr/include/eigen3 eigen_tensor_func.cpp
本征张量函数:在函数“int main()”中:
特征张量函数.cpp:12:16:错误:调用“func(特征::张量&)”时没有匹配函数
func(张量);
^
本征张量函数cpp:4:6:注:候选:“模板无效函数(本征::张量基&)”
void func(本征::张量基&a)
^~~~
特征张量函数cpp:4:6:注意:模板参数推导/替换失败:
本征张量函数cpp:12:16:注:“本征::张量基”是“本征::张量”的一个模糊基类
func(张量);

张量模块仍远未与本征/核心功能完全兼容(这也意味着核心功能的文档不一定适用于张量模块)

第一个主要区别是
TensorBase
采用两个模板参数而不是一个,即需要编写
TensorBase
。还有一些功能要么根本没有实现,要么
TensorBase
没有正确地转发它。当前干线的以下工程(2019-04-03):

模板
void func(本征::张量基&a)
{
//a*=2;//运算符*=(标量)未实现
//a=2*a;//运算符=(…)未实现/转发
a*=a;//好的
a*=2*a;//好的
a*=0*a+2;//确定
//a.derived()=2*a;//derived()不是公共的
静态_cast(a)=a*2;//确定
}
$ 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);
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
}