2011-08-26 27 views
16

宣言しようとすると、プライベート継承された基本クラスが「このコンテキスト内でアクセスできない」というエラーが表示される派生クラス内のベースクラスのメンバー::: Xと http://bytes.com/topic/c/answers/164246-private-inheritance-renders-class-inaccessibleプライベート継承で、このコンテキスト内で「アクセスできない」エラーが発生しました。

明示的に参照するXは、上記の場合に動作しますが、どのようなコードは、以下のような関数である場合:

void fooby() 
{ 
    class X {}; 

    class Y : private X {}; 

    class Z : public Y 
    { 
    public: 
     X x; // compiler "inaccessible within this context" error 
    }; 
}; 

方法あなたはこの場合Xを参照していますか?

foobyがstruct/classの場合、:: fooby :: Xは動作しますが、上記の場合にはどうすればよいか分かりません。

+0

同じタイプのメンバークラスと基本クラスの両方を使用しようとしていますか?たぶんそれは別の提案を助けるだろう。 –

+0

@マークB - これは、私が理解しようとしている動作を説明するための単なる人為的な例です。 –

答えて

10

あなたが直面している問題ではありませんXを指し、注入された識別子YX(およびすべての派生型)は、そこにあるということですあなたはアーカンソーので

class X {}; 
class Y : X {}; 
class Z : Y { 
    ::X x;   // or Namespace::X 
}; 

:名前空間レベルで宣言されているユーザー定義型の一般的な場合にはY.

以下のアクセスは、タイプを修飾し、アクセスを得るために、名前空間を使用することができます有効なオプションではない関数の中で型を定義する。

また、他の回避策を使用して問題を回避することもできます。

typedef class X {} another_name; 
class Y : X {}; 
class Z : Y { 
    another_name x; 
}; 

それとも、派生型に形を提供するために、Ytypedefを追加することができます:@Eugeneが提案されているように、あなたはXを参照するために、代替の識別子を作成することができます

class X {}; 
class Y : X { 
public: 
    typedef X X; 
}; 
class Z : Y { 
    X x; 
}; 

この最後のオプションの作品Xという識別子がpublicYの中に追加され、型を参照するので、コンパイラはその型を見つけてZに使用します。

+0

+1すばらしい答えと、私は今日別の方法で 'class'を使用することについて学びました。 –

+0

"次のオプション"( "クラスX x;")が間違っています。それはうまくいかない - それはちょうど同じであり、注入されたクラス名が個人的に継承されているためアクセスできないことを指す。あなたは、注入されたクラス名が型ではなくオブジェクトであるという誤解のようです。注入されたクラス名はクラスを参照し、型名です。 –

+0

@Johannes:はい、そういう誤解があったことは間違いありません。私は実際に標準でこれを調べようとしていました(g ++は4.2/4.7を受け入れますが、clang ++とcomeauはそれを拒否します)。 'class X x;'と 'identity :: type'の両方が失敗するようです。 –

9

良い質問ですが、私はそれを行う方法を見つけることができません。私が見る唯一のオプションは、Zのtypedefで外を導入することである。

typedef X PITA; 
class Z : public Y 
{ 
public: 
    PITA x; // ok 
}; 
関連する問題