Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 特征::矩阵中的模板重载算子_C++_Templates_Matrix_Eigen3 - Fatal编程技术网

C++ 特征::矩阵中的模板重载算子

C++ 特征::矩阵中的模板重载算子,c++,templates,matrix,eigen3,C++,Templates,Matrix,Eigen3,我得到了这个基本的代码: #include <iostream> #include <Eigen/Dense> using T12 = Eigen::Matrix<double, 2, 1>; using T22 = Eigen::Matrix<double, 2, 2>; template <typename Der1, typename Der2> T22 operator^ (const Eigen::MatrixBase&l

我得到了这个基本的代码:

#include <iostream>
#include <Eigen/Dense>

using T12 = Eigen::Matrix<double, 2, 1>;
using T22 = Eigen::Matrix<double, 2, 2>;

template <typename Der1, typename Der2> T22
operator^ (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
  return d1 * d2.transpose();
}

void testT12DyadT12 () {
  T12 t12_1, t12_2;
  t12_1 << 2.0, 3.0;  t12_2 << 1.5, 2.5;

  const double c1{2.0}, c2{0.5};
  T22 t22_1 = c1*t12_1 ^ t12_2*c2;
  std::cout << t22_1 << "\n"; 
}

int main () {
  testT12DyadT12();
  //testT1nDyadT1n ();
  return 0;
}
但它给出了以下编译器错误:

error: invalid operands to binary expression ('T1n<2>' (aka 'Eigen::Matrix<double, 2, 1, 0, 2, 1>') and 'T1n<2>')
T2n<2> t22_1 = t12_1 & t12_2;
               ~~~~~ ^ ~~~~~
note: candidate template ignored: couldn't infer template argument 'nc'
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der1>& d2) {
^
错误:二进制表达式('T1n'(也称为'Eigen::Matrix')和'T1n'的操作数无效
T2n t22_1=t12_1&t12_2;
~~~~~ ^ ~~~~~
注意:已忽略候选模板:无法推断模板参数“nc”
运算符&(常数本征::矩阵基&d1,常数本征::矩阵基&d2){
^

我理解错误消息(编译器无法推断模板arg)。我如何解决这个问题?我尝试将参数作为
const-Der1&,const-Der2&
传递给操作符,但没有效果。我确信这是一件愚蠢的事情……我没有理解或注意到。最终我的目标是将本征标量类型也模板化:
template使用T1n=Eigen::Matrix;
等等加载
operator^
您可以从
Der1::rowstatcompiletime
中派生返回类型的大小:

template <typename Der1, typename Der2> 
T2n<Der1::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
  return d1 * d2.transpose();
}
使用C++14,您当然可以只返回
auto
(这将返回一个惰性表达式,它可能是您所期望的,也可能不是您所期望的):

模板
汽车
运算符&(常数本征::矩阵基&d1,常数本征::矩阵基&d2){
返回d1*d2.transpose();
}

您可以从
Der1::rowstatcompiletime
导出返回类型的大小:

template <typename Der1, typename Der2> 
T2n<Der1::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
  return d1 * d2.transpose();
}
使用C++14,您当然可以只返回
auto
(这将返回一个惰性表达式,它可能是您所期望的,也可能不是您所期望的):

模板
汽车
运算符&(常数本征::矩阵基&d1,常数本征::矩阵基&d2){
返回d1*d2.transpose();
}

为什么您认为在
操作符和
模板参数中需要
int-nc
nc
在模板的其他任何地方都没有使用,因此无法推导。如果您需要
nc
模板参数,您需要使用类似
const-eigent::Matrix&d1
的东西作为函数参数。但为什么不直接忽略它呢?-同意,th最简单的方法是返回
auto
,如下面的答案所示。谢谢。为什么您认为在
运算符和
模板参数中需要
int nc
nc
在模板的其他任何地方都不使用,因此无法推导。您需要使用类似
const-Eigen::Matrix&d1
的函数arg如果您需要
nc
,请尝试。但为什么不直接忽略它呢?-同意,最简单的方法是使用
auto
返回,如下面的答案所示。谢谢。
@chtz
效果很好,谢谢。所有这些函数都将返回一个表达式,然后在构建
T2n t22_1
时进行惰性计算。您所说的惰性表达式是什么意思?谢谢例如,如果您执行了
auto r=a&b;
,然后打印
r
,然后修改
a
b
,然后再次打印
r
。明白了,使用
T2n r=a&b
r
包含结果-在这种情况下,我假设RHS仍然是一个表达式,但计算缓慢。使用
auto r=…
,它是一个表达式在使用之前,表达式始终保持不变。非常整洁!
@chtz
非常有效,谢谢。所有这些表达式都将返回一个表达式,然后在构建
T2n t22_1
时进行惰性计算。你说的惰性表达式是什么意思?谢谢。例如,如果你执行
auto r=a&b;
,然后打印
r
,然后修改
a
b
并再次打印
r
。明白了,使用
T2n r=a&b
r
包含结果-在这种情况下,我假设RHS仍然是一个表达式,但计算缓慢。使用
auto r=…
,它在使用之前始终是一个表达式。非常整洁!
template <typename Der1, typename Der2> 
Eigen::Matrix<typename Der1::Scalar, Der1::RowsAtCompileTime, Der2::RowsAtCompileTime>
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
  return d1 * d2.transpose();
}
template <typename Der1, typename Der2> 
auto
operator& (const Eigen::MatrixBase<Der1>& d1, const Eigen::MatrixBase<Der2>& d2) {
  return d1 * d2.transpose();
}