使用「;结构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() {}