Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++中做了一个类来概括两个稀疏矩阵求解器(Savelu和Sparse Cholesky)。当我尝试使用三元运算符时,它表示操作数类型不兼容,但如果使用if语句,代码将编译_C++_Eigen - Fatal编程技术网

本征函数中三元算子的类型误差 我在C++中做了一个类来概括两个稀疏矩阵求解器(Savelu和Sparse Cholesky)。当我尝试使用三元运算符时,它表示操作数类型不兼容,但如果使用if语句,代码将编译

本征函数中三元算子的类型误差 我在C++中做了一个类来概括两个稀疏矩阵求解器(Savelu和Sparse Cholesky)。当我尝试使用三元运算符时,它表示操作数类型不兼容,但如果使用if语句,代码将编译,c++,eigen,C++,Eigen,错误2错误:操作数类型不兼容(“const-Eigen::Solve

错误2错误:操作数类型不兼容(“const-Eigen::Solve,1,Eigen::amdorring,Eigen::Matrix>”和“const-Eigen::Solve,Eigen::colamdorring,Eigen::Matrix”)

X

整个代码:

#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
#pragma一次
#ifndef解算器
#定义解算器
#包括
#包括
#包括
#包括
#定义本征
类求解器{
私人:
布尔是乔尔斯基;
本征::SimplicialLDLT-cholesky;
艾根::斯巴塞鲁路;
公众:
解算器(布尔·伊斯·乔尔斯基){
这->is_cholesky=is_choleski;
}
特征::计算信息(){
返回值是_cholesky?cholesky.info():lu.info();
}
void compute(eigen::SparseMatrix&B){
是乔尔斯基吗?乔尔斯基。计算(B):lu。计算(B);
}
本征::矢量解算(本征::矢量解算&b){
返回值是_cholesky?cholesky.solve(b):lu.solve(b);//此处出错
}
};
#endif//SOLVER\u H

a
a?b:c
表达式类型的规则要求它是
b
表达式的类型或
c
表达式的类型

这里的
cholesky.solve(b)
的类型与
lu.solve(b)
不同,并且两者都没有到另一个的隐式转换。结果表达式将需要转换到
eigen::VectorXd
被忽略。因此,“操作数类型不兼容”错误

这里,每个表达式都必须直接转换为存在的
特征::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);

a
a?b:c
表达式类型的规则要求它要么是
b
表达式的类型,要么是
c
表达式的类型

这里的
cholesky.solve(b)
的类型与
lu.solve(b)
不同,并且两者都没有到另一个的隐式转换。结果表达式将需要转换到
eigen::VectorXd
被忽略。因此,“操作数类型不兼容”错误

这里,每个表达式都必须直接转换为存在的
特征::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);

谢谢Caleth!
eigen::VectorXd{cholesky.solve(b)}
(eigen::VectorXd)cholesky.solve(b)
?@RaphaelSampaio对编译器来说有什么区别吗:没有。对程序员来说:前者不意味着重新解释,也不意味着常量转换,后者是canThanks Caleth!eigen::VectorXd之间有什么区别吗{cholesky.solve(b)}和
(eigen::VectorXd)cholesky.solve(b)
?@RaphaelSampaio对编译器:不。对程序员:前者不能意味着重新解释强制转换,也不能意味着强制转换,后者可以
return is_cholesky ? eigen::VectorXd{ cholesky.solve(b) } : lu.solve(b);