使用「;结构Foo";现场decl不';t向前声明嵌套类 我很明显误解了在C++中如何同时使用“代码”>结构> x/COD>同时“声明”和引用类型的C-ISH特征。(另外,我甚至不知道这个特性到底叫什么。)我下面有三个例子来说明我在做什么,但主要的问题是:为什么嵌套类型(以这种方式向前声明)在全局范围内而不是在类范围内

使用「;结构Foo";现场decl不';t向前声明嵌套类 我很明显误解了在C++中如何同时使用“代码”>结构> x/COD>同时“声明”和引用类型的C-ISH特征。(另外,我甚至不知道这个特性到底叫什么。)我下面有三个例子来说明我在做什么,但主要的问题是:为什么嵌套类型(以这种方式向前声明)在全局范围内而不是在类范围内,c++,scope,nested,forward-declaration,C++,Scope,Nested,Forward Declaration,用于正向声明嵌套结构: #include <memory> class Foo1 { Foo1(); ~Foo1(); struct Impl; std::auto_ptr<Impl> m_pimpl; }; struct Foo1::Impl { Impl(){} ~Impl(){} }; Foo1::Foo1(){} Foo1::~Foo1(){} int main() {} 这里,编译器抱怨,在'Foo2a'中

用于正向声明嵌套结构:

#include <memory>
class Foo1
{
    Foo1();
    ~Foo1();
    struct Impl;
    std::auto_ptr<Impl> m_pimpl;
};

struct Foo1::Impl
{
    Impl(){}
    ~Impl(){}
};

Foo1::Foo1(){}
Foo1::~Foo1(){}

int main() {}
这里,编译器抱怨,
在'Foo2a'中没有名为'Impl'的结构。
。果然,它是全局范围的,正如编译:

#include <memory>
class Foo2b
{
    Foo2b();
    ~Foo2b();
    std::auto_ptr<struct Impl> m_pimpl;
};

struct Impl
{
    Impl(){}
    ~Impl(){}
};

Foo2b::Foo2b(){}
Foo2b::~Foo2b(){}

int main() {}
#包括
Foo2b类
{
Foo2b();
~Foo2b();
标准::自动ptr m_pimpl;
};
结构Impl
{
Impl(){}
~Impl(){}
};
Foo2b::Foo2b(){}
Foo2b::~Foo2b(){}
int main(){}
怎么回事?a) 为什么用这种方式“声明”类型
Impl
,以及b)既然它有效,为什么
Impl
在全局范围内不是类范围内


顺便说一句,将字段声明为
auto_ptr

首先声明为详细类型说明符的名称的范围取决于其使用方式

如果您执行
struct Impl该结构被声明为该声明发生在的任何作用域的成员,如第一个示例所示。但在任何其他上下文中,它都是在最近的封闭块或命名空间(但不是类)中声明的,如第二个和第三个示例所示

解决方案就是将其转发声明为
struct Impl。在此之后,您可以将其称为
Impl


有关详细规则,请参见[basic.scope.cdecl]/7。

首先声明为详细类型说明符的名称的范围取决于其使用方式

如果您执行
struct Impl该结构被声明为该声明发生在的任何作用域的成员,如第一个示例所示。但在任何其他上下文中,它都是在最近的封闭块或命名空间(但不是类)中声明的,如第二个和第三个示例所示

解决方案就是将其转发声明为
struct Impl。在此之后,您可以将其称为
Impl


有关详细规则,请参见[basic.scope.cdecl]/7。

FYI:auto_ptr已被弃用,可能很快将从该语言中删除。考虑使用“STD:UnQuijPtR”或“STD::SysDypTR”。“谢谢”,这只是一个例子,替代<代码> STD::SyrdYPPTR 或 STD::可选的如果您愿意的话,简短的答案是“因为C++就是这样工作的”。@davidbak将此成语替换为
unique\u ptr
FYI:auto\u ptr已被弃用,可能很快就会从该语言中删除。请考虑使用“STD:UnQuijPtR”或“STD::SysDypTR”。谢谢,这只是一个例子,替代<代码> STD::SyrdYPPTR 或 STD::如果你愿意,可以选择< < /代码>。简短的答案是“因为C++就是这样工作的”。现在我知道它是一个精心设计的类型说明符,我找到了一个很好的描述(尽管它实际上没有您描述的范围规则)。谢谢!现在我知道它是一个精心设计的类型说明符,我找到了一个很好的描述(尽管它实际上没有您描述的范围规则)。
#include <memory>
class Foo2b
{
    Foo2b();
    ~Foo2b();
    std::auto_ptr<struct Impl> m_pimpl;
};

struct Impl
{
    Impl(){}
    ~Impl(){}
};

Foo2b::Foo2b(){}
Foo2b::~Foo2b(){}

int main() {}