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();
}