Я хотел бы использовать унарную функцию для поиска определенного имени параметра в списке с помощью 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);
}
Это почему? И переменная-член, и функция-член имеют строковый тип.
Как заставить работать приведенный выше пример с помощью функции-члена?
Ошибка говорит вам, что вы вызываете неконстантный метод для константной ссылки. Неконстантный метод может модифицировать переменные-члены и, таким образом, нарушать ограничение const.
Вы можете решить это двумя способами:
Не вызывайте метод вообще и получите доступ к mName
переменная напрямую:
bool operator() (const Parameter& par) const {
return (mName == par.mName);
}
Обратите внимание, что это не требует принятия mName
общественности. Это работает, потому что operator()
является членом Parameter
учебный класс. Помните, что закрытые члены доступны в любом методе класса. Не имеет значения, имеете ли вы доступ к закрытым членам другого экземпляра того же класса или нет.
декларировать getName()
быть const
объекты:
string getName() const { return mName;}
Обратите внимание на расположение const
Классификатор. Это говорит компилятору, что метод не будет изменять никакие переменные-члены.
Других решений пока нет …