Question

J'essaie de créer une classe avec deux méthodes portant le même nom, utilisées pour accéder à un membre privé. Une méthode est publique et qualifiée de const, l'autre est privée et non const (utilisée par une classe d'amis pour modifier le membre au moyen d'un renvoi par référence).

Malheureusement, je reçois des erreurs de compilation (avec g ++ 4.3): lors de l'utilisation d'un objet non-const pour appeler la méthode, g ++ se plaint du fait que la version non-const de ma méthode est privée, même si une version publique (const) existe.

Cela semble étrange, car si la version privée non-const n'existe pas, tout se compile correctement.

Y at-il un moyen de faire ce travail? Compile-t-il sur d’autres compilateurs?

Merci.

Exemple:

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() */
}
Était-ce utile?

La solution

La résolution de surcharge se produit avant la vérification d'accès. Ainsi, lorsque vous appelez la méthode a sur un non-const A, le membre non-const est choisi comme meilleur résultat. Le compilateur échoue alors à cause du contrôle d'accès.

Il n’existe aucun moyen de "faire fonctionner ce travail", ma recommandation serait de renommer la fonction privée. Est-il nécessaire d'avoir un accesseur privé?

Autres conseils

Il ne sélectionnera la version const que si l'objet est déclaré est const , sinon il sélectionnera la version non const (même si cela entraîne une erreur).

Cela devrait fonctionner:

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

ou ceci:

A const& ra1 = a1;
cout << ra1.a() << endl;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top