Having the following code:
#include <iostream> #include <set> #include <string> #include <functional> using namespace std; class Employee { // ... int _id; string _name; string _title; public: Employee(int id): _id(id) {} string const &name() const { return _name; } void setName(string const &newName) { _name = newName; } string const &title() const { return _title; } void setTitle(string const &newTitle) { _title = newTitle; } int id() const { return _id; } }; struct compEmployeesByID: public binary_function<Employee, Employee, bool> { bool operator()(Employee const &lhs, Employee const &rhs) { return lhs.id() < rhs.id(); } }; int wmain() { Employee emplArr[] = {0, 1, 2, 3, 4}; set<Employee, compEmployeesByID> employees(emplArr, emplArr + sizeof emplArr/sizeof emplArr[0]); // ... set<Employee, compEmployeesByID>::iterator iter = employees.find(2); if (iter != employees.end()) iter->setTitle("Supervisor"); return 0; }
I can not compile this code with (MSVCPP 11.0):
1> main.cpp 1>d:\docs\programming\test01\test01\main.cpp(40): error C2662: 'Employee::setTitle' : cannot convert 'this' pointer from 'const Employee' to 'Employee &' 1> Conversion loses qualifiers
This helps to compile:
if (iter != employees.end()) const_cast<Employee &>(*iter).setTitle("Supervisor");
Question: I know that map and multimap save their values ββas pair(const K, V) , where K is the key and V is the value. We cannot change the object K. But set<T> and multiset<T> save their object as T , and not as const T So WHY DO I NEED THIS DESIGN?
source share