【发布时间】:2011-08-03 19:50:57
【问题描述】:
我有以下无法编译的代码示例:
#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(class base1* 指针) {}
void print(::my:: base1* 指针) {}
类 base1; 无效打印(base1* 指针){}
编辑:
int main()
{
my::base1 object1;
my::derived object3;
object3.print(&object1);
}
【问题讨论】:
-
你能发布 main() 吗?
-
很好的例子表明私有继承与组合完全不同!
标签: c++ class-members name-lookup private-inheritance