частная неконстантная и публичная константная функция - сосуществовать в мире? - PullRequest
14 голосов
/ 29 июля 2009

Я пытаюсь создать класс с двумя методами с одинаковыми именами, которые используются для доступа к приватному члену. Один метод является общедоступным и квалифицированным 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() */
}

Ответы [ 2 ]

13 голосов
/ 29 июля 2009

Разрешение перегрузки происходит перед проверкой доступа, поэтому, когда вы вызываете метод для неконстантного A, неконстантный член выбирается как лучшее совпадение. Компилятор не работает из-за проверки доступа.

Нет способа "заставить это работать", я бы рекомендовал переименовать приватную функцию. Есть ли необходимость в приватном доступе?

3 голосов
/ 29 июля 2009

Он выберет версию const, только если объявлен объект const, в противном случае он выберет версию не const (даже если это приведет к ошибке).

Это должно работать:

cout << ((const A*)&a1)->a() << endl;

или это:

A const& ra1 = a1;
cout << ra1.a() << endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...