【发布时间】:2020-11-27 14:13:36
【问题描述】:
我一直试图理解这一点,并试图找到一些关于类中结构类型定义的信息(对于 C++)。但是,对于我的实际疑问,我还没有找到任何好的解释。 如果我们有以下定义
namespace MyOuterNamespace {
namespace MyInnerNamespace {
class MyClass {
struct MyStruct {
int myVar;
};
MyStruct m_MyStruct;
};
}
}
在此示例代码中,m_MyStruct 是私有成员,因此无法从外部访问。但是结构定义是可访问的,我们可以在任何地方声明这种类型的结构变量
MyOuterNamespace::MyInnterNamespace::MyClass::MyStruct outsideStruct;
使这成为可能的主要因素是什么。如果结构被定义为类的私有部分中的类型,为什么可以从外部使用它?这是否仅用作结构定义的“命名空间”。它实际上并没有作为结构变量隐藏。
我发现了几篇文章,但也许来自类似线程的这个答案实际上是在回答并给出语言如何理解这一点的原则:Nested structures
谁能证实这一点或提供更好的解释?
[编辑] 您可以对公共定义执行此操作,但对于私有定义,您将面临预期的可见性错误。
谢谢!
【问题讨论】:
-
不,您不能访问类的内部类型。尝试编译上述
outsideStruct的声明会给出“错误:'MyStruct' 是 'MyOuterNamespace::MyInnterNamespace::MyClass' 的私有成员”。 -
“但是结构定义是可访问的,我们可以声明这种类型的结构变量” - 不,你不能!你编译过这个吗?如果是,如何?证明:coliru.stacked-crooked.com/a/accea178513b7692
-
我发现编译这个的唯一编译器是 Intels ICC(同时抱怨警告)——gcc、llvm 和 msvc 都(正确地)拒绝并显示错误消息:godbolt.org/z/3qWhcx
-
感谢您的回复。是的,毕竟这不是编译。结构定义在公共部分中,毕竟不是私有的。无论如何,我将把这个问题留在这里以供参考。谢谢大家!
标签: c++ class namespaces structure