2

以下代码对 C++ 标准有效吗?奇怪的是 C::B 会起作用,因为 struct B 在 A 的命名空间中。但它确实可以用 gcc 编译。

struct A { struct B {}; };
struct C : public A::B {};
struct D : public C::B {};

如果这是符合标准的 C++,那么这个结构的合理应用是什么?谢谢。

4

2 回答 2

3

是的,它是有效的 C++。一个类在它自己的范围内(因此两者都B引用B::B同一个类B),并且一个类的父类在它自己的范围内。所以既然Bis 在C's 范围内并且B在它自己的范围内,C::B指的是Bwhich is A::B

(旁注:不要将命名空间范围混淆。)

C++03 §9 第 2 段说:

名被插入到在看到类名之后立即声明它的作用域中。类也被插入到类本身的范围内;这被称为注入类名。出于访问检查的目的,注入的类名被视为公共成员名。

于 2012-09-27T19:34:55.700 回答
0

这是符合标准的 C++。

嵌套类的一个合理应用(通过范围解析)是 pImpl 设计模式(尽管您可以以不会演示嵌套类的方式实现它,但这里我选择演示嵌套类)。注意:继承是可能令人困惑的方面之一,但真正的概念是嵌套类的范围解析。

//ExposedClass in Exposed.h

class CExposedClass
{
public:
CExposedClass();
~CExposedClass();
void doThis();
void doThat();

private:
class CXImpl;
CXImpl *pImpl;

};

//ExposedClass Impl in Exposed.cpp

#include "Exposed.h"

class CExposedClass::CXImpl
{
 int someData;
};

CExposedClass::CExposedClass():pImpl(new CXImpl()){}
CExposedClass::~CExposedClass(){delete pImpl;}
void CExposedClass::doThis(){}
void CExposedClass::doThat(){}

在一个类的范围内定义的类使用范围解析从另一个范围寻址。

于 2012-09-27T19:38:05.247 回答