Pregunta

Estoy tratando de crear una clase con dos métodos con el mismo nombre, que se usa para acceder a un miembro privado. Uno de los métodos es público y está calificado por constantes, el otro es privado y no constante (utilizado por una clase amiga para modificar el miembro por medio de la devolución por referencia).

Desafortunadamente, estoy recibiendo errores de compilación (usando g ++ 4.3): cuando uso un objeto non-const para llamar al método, g ++ se queja de que la versión non-const de mi método es privada, aunque sea una versión pública (const) existe.

Esto parece extraño, porque si la versión privada no constante no existe, todo se compila bien.

¿Hay alguna manera de hacer que esto funcione? ¿Se compila en otros compiladores?

Gracias.

Ejemplo:

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() */
}
¿Fue útil?

Solución

La resolución de sobrecarga ocurre antes de la verificación de acceso, por lo que cuando llama a un método en una A no constante, el miembro no const es elegido como una mejor coincidencia. El compilador falla luego debido a la verificación de acceso.

No hay manera de "hacer que esto funcione", mi recomendación sería cambiar el nombre de la función privada. ¿Hay alguna necesidad de tener un acceso privado?

Otros consejos

Solo seleccionará la versión const si el objeto se declara como const ; de lo contrario, seleccionará la versión que no sea const (incluso si eso resulta en un error).

Esto debería funcionar:

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

o esto:

A const& ra1 = a1;
cout << ra1.a() << endl;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top