C++ 不能使用与私有基相同的类
c++ cannot use same class as private base
我想知道为什么下面的例子不编译: 我有一个 ImageContainer 类,它私下继承自 Image(因此,用户不应该知道它继承自 Image(。 此类还包含图像列表,并具有 AddImage 函数。
class ImageContainer: private Image {
public:
ImageContainer (){};
void addImage (const Image &img){
//adds image to the container
};
std::vector<Image> images;
};
class DerivedImageContainer: public ImageContainer {
public:
void init () {
addImage (Image (background, Position(960, 533), Align::MiddleCenter));
}
};
从一个派生类(DerivedImageContainer(中,我想调用addImage函数,将一个新图像添加到列表中。
我很惊讶地看到这无法编译。错误是:
error: ‘class Image Image::Image’ is inaccessible within this context
我正在创建一个与图像容器的基类完全无关的图像 我甚至没有触及ImageContaner的内部内容,我只是在调用公共函数。为什么编译器会抱怨?
这是否意味着,在派生函数中,我们不能在类层次结构中的某个地方使用与私有继承类具有相同类型的成员?
它不适用于 g++ 4.8.2 和 g++ 7.5.0
访问检查在名称查找后执行。这里的问题是范围问题。在类的作用域内,非限定名称查找从类内部进入其基。因此,它找到Image
作为碱基的类型名称。然后,它必须检查此基础的可访问性。因此错误。
补救措施是不要执行非限定名称查找。通过其他方式指定Image
。
addImage ( ::Image (background, Position(960, 533), Align::MiddleCenter) );
::Image
是命名空间范围内类型的完全限定名。因此,它跳过了类范围内的查找。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么虚函数不能是静态的和全局的?
- 为什么我不能在 while 循环中创建线程?
- 为什么这个音频包络不能通过开关的情况?
- 不能将复制初始化与隐式转换的多个步骤一起使用