Унарный предикат с функцией-членом

Я хотел бы использовать унарную функцию для поиска определенного имени параметра в списке с помощью 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 общедоступной и использую ее вместо функции-члена Parameter :: getName () в операторе возврата Param_eq :: operator (), она будет скомпилирована без ошибок.

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

Это почему? И переменная-член, и функция-член имеют строковый тип.

Как заставить работать приведенный выше пример с помощью функции-члена?

-1

Решение

Ошибка говорит вам, что вы вызываете неконстантный метод для константной ссылки. Неконстантный метод может модифицировать переменные-члены и, таким образом, нарушать ограничение 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 Классификатор. Это говорит компилятору, что метод не будет изменять никакие переменные-члены.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]