eclipse C++ 中无法识别受保护的成员

Posted

技术标签:

【中文标题】eclipse C++ 中无法识别受保护的成员【英文标题】:Protected member not recognized in eclipse C++ 【发布时间】:2012-11-23 11:26:19 【问题描述】:

我有以下类,我尝试访问基类的受保护成员,但在 eclipse 中出现错误“无法解析字段分解”。有人可以向我解释我做错了什么吗?为什么我无法访问变量mFactorized ??

基类

template <typename ValueType>
class AbstractDirectLinearSolver
protected:
    bool mFactorized;
public:
    //Constructors, destructor
    AbstractDirectLinearSolver()
        mFactorized = false;
    

    virtual ~AbstractDirectLinearSolver();

    //Methods
    virtual void Solve(Vector<ValueType>& x, const Vector<ValueType>& b) const = 0;
    virtual void Factorize(AbstractMatrix<ValueType>& A) = 0;
;

派生类

#include "AbstractDirectLinearSolver.hpp"

template<typename ValueType>
class CholeskySolver: public AbstractDirectLinearSolver 
private:
    AbstractMatrix<ValueType> *mR; //Pointer = Abstract class NOT ALLOWS instantiation !!
public:
    CholeskySolver() 
        mR = NULL;
    

    ~CholeskySolver() 
        if (this->mFactorized)   //ERROR HERE
            delete mR;
        
    

    void Solve(const Vector<ValueType>& x, const Vector<ValueType>& b) 
        Vector<ValueType> y(mR->ApplyLowInv(b));
        x = mR->ApplyLowerTransponse(y);
    

    void Factorize(AbstractMatrix<ValueType>& A) 
        if (mR != NULL)
            delete mR;
        mR = NULL;
        A.CholeskyFactorization(mR);
        this->mFactorized;           //ERROR HERE
    
;

【问题讨论】:

您是否真的从两行中都得到了错误,或者只是第一行您忘记了变量名上奇怪的伪匈牙利疣 (m)?如果是这样,第二个错误到底是什么? 第一次忘记把m放在Factorized之前。更改后,eclipse 用Field mFactorized could not be resolved 标记这些行 所以这不是编译问题?是 IDE 问题? 你的编译器是在抱怨,还是只是 Eclipse? 嗯,我认为这是一个IDE问题,因为我编译它并且没有错误。 【参考方案1】:

您正在尝试从类模板而不是类继承。将类头改为:

template<typename ValueType>
class CholeskySolver: public AbstractDirectLinearSolver<ValueType>
                                                       ^^^^^^^^^^^

在抱怨mFactorized 不是成员(因为它不知道基类)之后,编译器似乎退出了,但在抱怨基类说明符无效之前。

如果您要注释掉有问题的行,那么您会得到一个稍微好一点(尽管仍然相当混乱)的错误:expected class-name before ‘’ token

【讨论】:

非常感谢。是的,实际上我没有考虑到这一点。有时我对模板感到困惑。 不错的收获 - @BRabbit27 很容易错过 - 我猜 Eclipse 是一个很好的 IDE,因为它一直在抱怨。【参考方案2】:
if (this->Factorized) 

应该是

if (this->mFactorized)

第二个错误...

this->mFactorized;           //ERROR HERE

除了它没有做任何事情之外......我认为应该没有问题。

【讨论】:

是的,第一个是拼写错误,但是 Eclipse 一直将其标记为错误,上面写着Field Factorized could not be resolved。我认为没有问题,但为什么它被标记为一个? 如果您错过了this-&gt; 部分,它是否仍然突出显示?也可能需要重新索引。除此之外,恐怕我不太了解 Eclipse。

以上是关于eclipse C++ 中无法识别受保护的成员的主要内容,如果未能解决你的问题,请参考以下文章

受保护的成员不能通过指针或对象 c++ 访问

绕过错误 C2248“无法访问在类中声明的受保护成员”的有效方法

在派生类中无法访问受保护的成员

Java中的间接子类无法访问的超类中的受保护成员

静态成员函数无法访问类的受保护成员

在派生类中无法访问受保护的成员?