书上说是,嵌套类作为私有,在类的外部将不能访问,测试中使用书中相同的方式使用为auto推断,为什么在qt中可行呢:
#include <QCoreApplication>
#include<iostream>
using namespace std;
class a
{
private:
class b
{
private:
int x{22};
friend class a;
explicit b(int y):x{y}{}
public:
void getbx(){cout<<"b.x is: "<<x<<endl;}
int z{33};
};
public:
b creatb(){return b(66);}
class c
{
public:
int x{55};
};
};
int main(int argc, char *argv[])
{
QCoreApplication ax(argc, argv);
a obja;
obja.creatb().getbx();
//a::b objb; 使用私有成员错误
auto objb=obja.creatb();//这样为什么可行
cout<<objb.z<<endl;
a::c objc;
return ax.exec();
}
问题中有个字打错了,应该是:一个关于c++ 17嵌套类作为外部类的私有成员部份的问题
#迷惑
感觉是各个编译器的实现不同
嵌套类声明服从成员访问说明符,从外围类的作用域之外不能指名私有的成员类,尽管可以操作该类的对象:
class enclose
{
struct nested // 私有成员
{
void g() {}
};
public:
static nested f() { return nested{}; }
};
int main()
{
//enclose::nested n1 = e.f(); // 错误:'nested' 是私有的
enclose::f().g(); // OK:没有指名 'nested'
auto n2 = enclose::f(); // OK:没有指名 'nested'
n2.g();
}
这是c++的规定
https://zh.cppreference.com/w/cpp/language/nested_types