不知道在哪里问(如果这是一个不恰当的问题,请随时关闭)但我在C ++ 17提案中没有找到任何相关内容,this或this提及它在处理嵌套命名空间时加入C ++。
所以目前这是唯一的选择:
class A
{
public:
class B; //forward-declared INSIDE class/namespace
};
class A::B //defined outside
{
};
这可以在C ++ 17中实现吗?
class A::B; //forward declared NESTED outside of parent class/namespace
class C
{
A::B *b;
};
然后或者这个(1)(似乎是嵌套的namepsace定义的提议)
class A::B //definition of A::B without defining A
{
};
或这(2)
class A
{
public:
class A::B
{
};
};
或[3]
class A
{
public:
class B;
};
class A::B
{
};
我怀疑A::B
的定义没有首先定义A
可能不起作用(尽管提案似乎允许)。
答案 0 :(得分:7)
针对标题为Forward declarations of nested classes
P0289R0的问题提出了一项提案。但是正如您在上一篇Trip Report: C++ Standards Meeting in Jacksonville, February 2016中所看到的那样,该提案倾向于鼓励进一步开展工作的提案。我引用了委员会的判决结果(强调我的):
这样可以让
X::A*
之类的内容显示在标题中 要求X
的定义也出现在标题中 (X
和X::A
的前向声明就足够了。 EWG找到了 用例引人注目,因为目前有很多类定义 仅出现在标头中,因为标头中定义的接口使用 指针或对类型的嵌套类的引用。 几个细节 还需要解决。 (例如,如果a会发生什么X
的定义没有出现在任何其他翻译单元(TU)中? 如果X
的定义出现在另一个TU中,但没有出现,会发生什么 定义嵌套的class A
?如果确实定义了嵌套类会发生什么 A,但它是私人的吗?可能必须回答部分或全部这些问题 “形成不良,无需诊断”,因为诊断错误 这种类型需要大量的链接器支持。)