私有继承:名称查找错误

| 我有以下未编译的代码示例:
#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 ++标准中看到这是正确的行为,而不是编译器中的错误(我确定这不是错误;我检查过的所有编译器的行为都如此)? 我该如何解决该错误?以下所有修复程序均有效,但我应该选择哪一个?   无效的打印(类base1 *指针){}      无效的print(:: my :: base1 *指针){}      class base1;   void print(base1 *指针){} 编辑:
int main()
{
    my::base1 object1;
    my::derived object3;
    object3.print(&object1);
}
    
已邀请:
您要查找的部分是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
};
    

要回复问题请先登录注册