【问题标题】:Unary predicate with member function具有成员函数的一元谓词
【发布时间】:2018-04-24 16:01:04
【问题描述】:

我想使用一元函数在带有 std::find 的列表中查找某个参数名称

class Parameter {
    public:
        string getName() { return mName;}
        //string mName;
    private:
        string mName;
        string mType;
        string mValue;
    };

    class Param_eq : public unary_function<Parameter, bool> {
        string mName;
    public: 
        Param_eq (const string& name) : mName(name) {}
        bool operator() (const Parameter& par) const { 
            return (mName == par.getName());
        }
    };

    double Config::getDouble(string& name) {
        list<Parameter>::iterator iParam = find(mParamList.begin(), mParamList.end(), Param_eq(name));
        double para = iParam->getDouble();
        return para;
    }
}

但我得到以下编译器错误

error C2662: 'Parameter::getName' : cannot convert 'this' pointer from 'const Parameter' to 'Parameter &'
Conversion loses qualifiers

如果我将成员变量 Parameter::mName 设为 public 并在 Param_eq::operator() 的返回语句中使用它而不是成员函数 Parameter::getName() 则编译不会出错。

bool operator() (const Parameter& par) const { 
    return (mName == par.mName);
}

这是为什么呢?成员变量和成员函数都是字符串类型。

如何使用成员函数使上述示例工作?

【问题讨论】:

  • 哪一行导致错误?
  • string getName() const { return mName;} 你有Param_eq 接受一个常量Parameter,但是说getName 可能会修改它被调用的对象。这就是编译器试图告诉你的。

标签: c++ algorithm unary-function


【解决方案1】:

该错误告诉您正在对 const 引用调用非 const 方法。非 const 方法可能会修改成员变量,从而违反 const 约束。

你可以通过两种方式解决:

  1. 根本不调用方法,直接访问mName变量:

    bool operator() (const Parameter& par) const { 
        return (mName == par.mName);
    }
    

    请注意,这不需要公开mName。这是因为operator()Parameter 类的成员。请记住,私有成员可以在类的任何方法中访问。是否访问同一类的另一个实例的私有成员并不重要。

  2. getName() 声明为const 对象:

    string getName() const { return mName;}
    

    注意const 限定符的位置。这告诉编译器该方法不会修改任何成员变量。

【讨论】:

  • 返回 const string &amp; 以避免产生临时对象并使 getter 不被抛出也是有意义的。
  • @VTT 好点。虽然与 OP 询问的错误没有直接关系。
  • @VTT 通常,const 方法不应返回对内部数据的引用(const 或其他)。首选按值返回。
  • @Code-Apprentice 将getName() 声明为const 解决了问题,但是,尝试访问Parameter_eq::operator() 中的私有Parameter::mName 不起作用并生成编译错误'无法访问私有成员'。不过,问题解决了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2018-04-02
  • 1970-01-01
相关资源
最近更新 更多