Литб решение прямо на этом.
Тем не менее, я хотел бы сделать немного, чтобы уточнить, что на самом деле означает сообщение компилятора и как его расшифровать.
Итак, вот более подробное объяснение сообщения об ошибке и как его понять в этом контексте.Я надеюсь, что все гуру здесь исправят мое понимание.
"ошибка C2662: 'Cfoo :: GetNum': невозможно преобразовать этот 'указатель' из 'const Cfoo' в 'Cfoo &' Преобразование теряет квалификаторы"
- Тип
'bar'
- 'Cfoo const *'.
Функция-член, такая как 'GetNum'
в OP, - считается быть объявленным как
int Cfoo :: GetNum (Cfoo & dummyimpliedobjectparameter);// подразумеваемый объектный аргумент согласно 13.3.1/3 and /4
В соответствии с 13.3.1.1.1/2
Вызов функции bar->GetNum()
обрабатывается как (*bar).GetNum(*bar)
, где (*bar)
- этоimplied object argument
Теперь это означает, что объект типа 'Cfoo const'
должен быть привязан к ссылке типа 'Cfoo &'
, чтобы сопоставить аргумент вызова функции с параметром функции.Согласно 8.5.3/5'
, это не разрешено, поскольку reference to non const
не может связываться с const
.
Так что, как предлагает Литб, способ выручить - сделать Cfoo::GetNum
как const
функция-член.Согласно 13.3.1/3
, с этим изменением функция-член Cfoo::GetNum
теперь рассматривается как
int Cfoo::GetNum(Cfoo const &dummyimpliedobjectparameter); // note the const
Теперь функции-вызовы и параметры-члены точно совпадают икод правильно сформирован.
@ Стивен: теперь ошибка компиляции имеет больше смысла?