不知道在哪里问(您可以随时关闭这一点,如果它是一个不恰当的问题),但我还没有具体的C++ 17周的提案发现这样的东西,无论是这个或这与嵌套命名除了C++打交道时提到它.
所以目前这是唯一的选择:
class A
{
public:
class B; //forward-declared INSIDE class/namespace
};
class A::B //defined outside
{
};
Run Code Online (Sandbox Code Playgroud)
这在C++ 17中是否可行?
class A::B; //forward declared NESTED outside of parent class/namespace
class C
{
A::B *b;
};
Run Code Online (Sandbox Code Playgroud)
然后是这个(1)(似乎是嵌套的namepsace定义的提议)
class A::B //definition of A::B without defining A
{
};
Run Code Online (Sandbox Code Playgroud)
或者这个(2)
class A
{
public:
class A::B
{
};
};
Run Code Online (Sandbox Code Playgroud)
或者这[3]
class A
{
public:
class B;
};
class A::B
{
};
Run Code Online (Sandbox Code Playgroud)
我怀疑A::B没有A先定义的定义可能不起作用(尽管提案似乎允许).
关于题为Forward declarations of nested classes P0289R0的问题有一个提案.但是,正如您在2016年2月杰克逊维尔举行的上一次旅行报告:C++标准会议上所看到的那样,该提案倾向于鼓励进一步开展工作的提案.我引用了委员会的判决(Emphasis Mine):
这样就可以
X::A*在标题中出现,而不需要定义X也出现在标题中(前向声明X并且X::A足够).EWG发现用例很有吸引力,因为目前很多类定义只出现在头文件中,因为头文件中定义的接口使用指针或对类型嵌套类的引用.仍有一些细节需要解决.(例如,如果定义X没有出现在任何其他翻译单元(TU)中会发生什么?如果定义X出现在另一个TU中,但没有定义嵌套,class A会发生什么?如果它定义了嵌套类A会发生什么? ,但它是私有的?部分或全部的答案可能必须是"格式错误,无需诊断",因为诊断此类错误需要大量的链接器支持.)