ana*_*lyg 13 c++ class-members private-inheritance name-lookup
我有以下不编译的代码示例:
#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);}
};
}
Run Code Online (Sandbox Code Playgroud)
gcc打印的错误是:
test.cpp:6:错误:`class my :: base1'无法访问
test.cpp:17:错误:在此上下文中
现在,我可以猜出问题是什么:在查看声明时print,编译器会看到base1并认为:base1是基类子对象derived* this,但是您无法访问它!虽然我打算这base1应该只是一个类型名称.
我怎么能在C++标准中看到这是一个正确的行为,而不是编译器中的错误(我确定它不是一个错误;我检查过的所有编译器都表现得如此)?
我该如何解决这个错误?所有以下修复工作,但我应该选择哪一个?
void print(class base1*pointer){}
void print(:: my :: base1*pointer){}
class base1; void print(base1*pointer){}
编辑:
int main()
{
my::base1 object1;
my::derived object3;
object3.print(&object1);
}
Run Code Online (Sandbox Code Playgroud)
Ben*_*ott 12
你要找的部分是11.1.它建议使用:: my :: base1*来解决这个问题:
[注意:在派生类中,基类名称的查找将在声明它的作用域中找到inject-class-name而不是基类的名称.inject-name的名称可能比声明它的作用域中的基类名称更不易访问. - 结束说明]
[ Example:
class A { };
class B : private A { };
class C : public B {
A *p;
// error: injected-class-name A is inaccessible
:: A * q ;
// OK
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |