13

コンパイルされない次のコード例があります。

#include <stdio.h>

namespace my
{
    class base1
    { // line 6
    };

    class base2: private base1
    {
    };

    class derived: private base2
    {
    public:
        // The following function just wants to print a pointer, nothing else!
        void print(base1* pointer) {printf("%p\n", pointer);}
    };
}

gcc が出力するエラーは次のとおりです。

test.cpp:6: エラー: `class my::base1' にアクセスできません

test.cpp:17: エラー: このコンテキスト内

これで、何が問題なのか推測できます。 の宣言を見るとprint、コンパイラはが の基本クラスのサブオブジェクトであることを認識して判断しますが、あなたはそれにアクセスできません! 私はそれが単なる型名であるべきだと思っていますが。base1base1derived* thisbase1

C++ 標準で、これが正しい動作であり、コンパイラのバグではないことを確認するにはどうすればよいですか (バグではないと確信しています。チェックしたすべてのコンパイラはそのように動作しました)。

このエラーを修正するにはどうすればよいですか? 以下の修正はすべて機能しますが、どれを選択すればよいですか?

void print(クラスbase1* ポインター) {}

void print( ::my:: base1* ポインタ) {}

クラス base1; void print(base1* ポインタ) {}


編集:

int main()
{
    my::base1 object1;
    my::derived object3;
    object3.print(&object1);
}
4

1 に答える 1

12

お探しのセクションは 11.1 です。::my::base1* を使用してこれを回避することをお勧めします。

[注: 派生クラスでは、基本クラス名のルックアップは、それが宣言されたスコープ内の基本クラスの名前ではなく、注入されたクラス名を見つけます。注入されたクラス名は、それが宣言されたスコープ内の基本クラスの名前よりもアクセスしにくい場合があります。— エンドノート]

[ Example:
class A { };
class B : private A { };
class C : public B {
A *p;
// error: injected-class-name A is inaccessible
:: A * q ;
// OK
};
于 2011-04-12T11:53:30.887 に答える