【问题标题】:Type error in ternary operator in EigenEigen 中的三元运算符中的类型错误
【发布时间】:2017-09-25 11:53:24
【问题描述】:

我正在用 C++ 做一个类来概括两个稀疏矩阵求解器(SparseLU 和 Sparse Cholesky)。当我尝试使用三元运算符时,它说操作数类型不兼容,但如果我使用 If 语句,代码就会编译。

错误 2 错误:操作数类型不兼容 ("const Eigen::Solve , 1, Eigen::AMDOrdering > , Eigen:: Matrix > " 和 "const Eigen::Solve , Eigen::COLAMDOrdering > , Eigen::Matrix > ")

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

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

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

    这里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);
    

    【讨论】:

    • 谢谢卡莱斯! eigen::VectorXd{cholesky.solve(b)}(eigen::VectorXd) cholesky.solve(b) 有什么区别吗?
    • @RaphaelSampaio 致编译器:不。对程序员来说:前者can't意味着reinterpret_cast,也不意味着const_cast,后者can
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2011-11-29
    • 2014-05-03
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多