19

プライベートメンバーにアクセスするために使用される、同じ名前の2つのメソッドを持つクラスを作成しようとしています。1つのメソッドはpublicでconst修飾されており、もう1つはprivateでnon-constです(参照による戻りに​​よってメンバーを変更するためにフレンドクラスによって使用されます)。

残念ながら、コンパイルエラーが発生します(g ++ 4.3を使用):非constオブジェクトを使用してメソッドを呼び出すと、パブリック(const)バージョンが存在していても、g++はメソッドの非constバージョンがプライベートであると文句を言います。

プライベートの非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() */
}
4

2 に答える 2

16

オーバーロードの解決はアクセス チェックの前に行われるため、非 const A でメソッドを呼び出すと、非 const メンバーがより適切な一致として選択されます。その後、コンパイラはアクセス チェックのために失敗します。

「これを機能させる」方法はありません。プライベート関数の名前を変更することをお勧めします。プライベート アクセサーを用意する必要はありますか?

于 2009-07-29T16:02:07.900 に答える
4

constオブジェクトが宣言されている場合にのみバージョンconstを選択します。それ以外の場合は、非constバージョンを選択します(エラーが発生した場合でも)。

これは機能するはずです:

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

またはこれ:

A const& ra1 = a1;
cout << ra1.a() << endl;
于 2009-07-29T16:05:33.120 に答える