Частная некоммерческая и общественная функция-член - сосуществующая в мире?

Я пытаюсь создать класс с двумя методами с тем же именем, которые используются для доступа к частному члену. Один из методов является общедоступным и const-независимым, другой является частным и неконстантным (используется классом друзей для изменения члена посредством обратного обращения).

К сожалению, я получаю компиляцию ошибок (с использованием g++ 4.3): при использовании объекта non-const для вызова метода 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() */
}

Ответы

Ответ 1

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

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

Ответ 2

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

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

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

или это:

A const& ra1 = a1;
cout << ra1.a() << endl;