частные неконстантные и публичные функции-члены const - сосуществуют в мире?
-
05-07-2019 - |
Вопрос
Я пытаюсь создать класс с двумя методами с одинаковым именем, используемыми для доступа к закрытому члену.Один метод является общедоступным и имеет значение const, другой - частный и неконстантный (используется дружественным классом для изменения члена посредством возврата по ссылке).
К сожалению, я получаю ошибки компиляции (используя g ++ 4.3):При использовании неконстантного объекта для вызова метода g ++ жалуется, что неконстантная версия моего метода является частной, хотя существует общедоступная (const) версия.
Это кажется странным, потому что, если частная неконстантная версия не существует, все компилируется нормально.
Есть ли какой-нибудь способ заставить это работать?Компилируется ли он на других компиляторах?
Спасибо.
Пример:
class A
{
public:
A( int a = 0 ) : a_(a) {}
public:
int a() const { return a_; }
private:
int & a() { return a_; } /* Comment this out, everything works fine */
friend class B;
private:
int a_;
};
int main()
{
A a1;
A const a2;
cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails */
cout << a2.a() << endl; /* fine: uses the const version of a() */
}
Решение
Разрешение перегрузки происходит перед проверкой доступа, поэтому, когда вы вызываете метод a для неконстантного A, неконстантный элемент выбирается как более подходящий.Затем компилятор завершает работу с ошибкой из-за проверки доступа.
Нет никакого способа "заставить это работать", моей рекомендацией было бы переименовать закрытую функцию.Есть ли какая-либо необходимость в личном аксессуаре?
Другие советы
Он будет выбирать только const
версия, если объект объявлен, равна const
, в противном случае он выберет не-const
версия (даже если это приводит к ошибке).
Это должно сработать:
cout << ((const A*)&a1)->a() << endl;
или это:
A const& ra1 = a1;
cout << ra1.a() << endl;