funzione privata non costante e pubblica const - coesistono in pace?
-
05-07-2019 - |
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() */
}
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;