具有成员函数的一元谓词

时间:2017-11-11 15:18:47

标签: c++ algorithm unary-function

我想使用一元函数在列表中使用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()的return语句中使用它而不是成员函数Parameter :: getName(),则编译时没有错误。

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

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

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

1 个答案:

答案 0 :(得分:2)

该错误告诉您正在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限定符的位置。这告诉编译器该方法不会修改任何成员变量。