我正在用 C++ 编写一个类来概括两个稀疏矩阵求解器(SparseLU 和 Sparse Cholesky)。当我尝试使用三元运算符时,它说操作数类型不兼容,但如果我使用 If 语句,代码就会编译。
错误 2 错误:操作数类型不兼容(“const Eigen::Solve , 1, Eigen::AMDOrdering > , Eigen::Matrix > " 和 "const Eigen::Solve , Eigen::COLAMDOrdering > , Eigen ::矩阵 > ")
eigen::VectorXd solve(eigen::VectorXd &b) {
return is_cholesky ? cholesky.solve(b) : lu.solve(b); // ERROR
}
X
eigen::VectorXd solve(eigen::VectorXd &b) {
if (is_cholesky) {
return cholesky.solve(b);
}
else {
return lu.solve(b);
}
}
整个代码:
#pragma once
#ifndef SOLVER_H
#define SOLVER_H
#include <Eigen/Core>
#include <Eigen/Sparse>
#include <Eigen/SparseLU>
#include <Eigen/SparseCholesky>
#define eigen Eigen
class Solver {
private:
bool is_cholesky;
eigen::SimplicialLDLT<eigen::SparseMatrix<double>> cholesky;
eigen::SparseLU<eigen::SparseMatrix<double>> lu;
public:
Solver(bool is_choleski) {
this->is_cholesky = is_choleski;
}
eigen::ComputationInfo info() {
return is_cholesky ? cholesky.info() : lu.info();
}
void compute(eigen::SparseMatrix<double> &B) {
is_cholesky ? cholesky.compute(B) : lu.compute(B);
}
eigen::VectorXd solve(eigen::VectorXd &b) {
return is_cholesky ? cholesky.solve(b) : lu.solve(b); // ERROR HERE
}
};
#endif // SOLVER_H
a 类型的规则a ? b : c
表达式要求它是以下类型之一b
表达式或类型c
表达。
Here cholesky.solve(b)
有一个不同的类型lu.solve(b)
并且两者都没有隐式转换到另一个。结果表达式需要转换为eigen::VectorXd
被忽略。因此出现“操作数类型不兼容”错误。
return is_cholesky ? cholesky.solve(b) : lu.solve(b); // ERROR
这里每个表达式都必须直接转换为eigen::VectorXd
,存在。
if (is_cholesky) {
return cholesky.solve(b);
}
else {
return lu.solve(b);
}
您可以强制指定类型?:
表达到eigen::VectorXd
通过明确提及,例如
return is_cholesky ? eigen::VectorXd{ cholesky.solve(b) } : lu.solve(b);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)