コンパイルされない次のコード例があります。
#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
、コンパイラはが の基本クラスのサブオブジェクトであることを認識して判断しますが、あなたはそれにアクセスできません! 私はそれが単なる型名であるべきだと思っていますが。base1
base1
derived* this
base1
C++ 標準で、これが正しい動作であり、コンパイラのバグではないことを確認するにはどうすればよいですか (バグではないと確信しています。チェックしたすべてのコンパイラはそのように動作しました)。
このエラーを修正するにはどうすればよいですか? 以下の修正はすべて機能しますが、どれを選択すればよいですか?
void print(クラスbase1* ポインター) {}
void print( ::my:: base1* ポインタ) {}
クラス base1; void print(base1* ポインタ) {}
編集:
int main()
{
my::base1 object1;
my::derived object3;
object3.print(&object1);
}