Domanda

Sto cercando di creare una classe con due metodi con lo stesso nome, utilizzati per accedere a un membro privato. Un metodo è pubblico e const qualificato, l'altro è privato e non const (utilizzato da una classe di amici per modificare il membro come ritorno per riferimento).

Sfortunatamente, ricevo errori di compilazione (usando g ++ 4.3): quando uso un oggetto non const per chiamare il metodo, g ++ si lamenta che la versione non const del mio metodo è privata, anche se una versione pubblica (const) esiste.

Sembra strano, perché se la versione non const privata non esiste, tutto viene compilato correttamente.

C'è un modo per farlo funzionare? Si compila su altri compilatori?

Grazie.

Esempio:

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() */
}
È stato utile?

Soluzione

La risoluzione del sovraccarico si verifica prima del controllo dell'accesso, quindi quando si chiama il metodo a su una A non const, il membro non const viene scelto come una corrispondenza migliore. Il compilatore quindi non riesce a causa del controllo di accesso.

Non c'è modo di "rendere questo lavoro", la mia raccomandazione sarebbe di rinominare la funzione privata. C'è bisogno di un accessor privato?

Altri suggerimenti

Selezionerà la versione const se l'oggetto è dichiarato const , altrimenti selezionerà la versione non const (anche se ciò provoca un errore).

Questo dovrebbe funzionare:

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

o questo:

A const& ra1 = a1;
cout << ra1.a() << endl;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top