我可以在C ++中“转发声明”什么?

时间:2010-09-26 21:11:15

标签: c++ forward-declaration

我知道我能做到

class Foo;

可能

struct Bar;

和全局函数

bool IsValid(int iVal);

键入的枚举怎么样?在未申报的课程中输入的枚举怎么样?具有未声明的类的函数怎么样?那个未申报的课程中的静态成员怎么样?在未知的命名空间中这些怎么办?我错过了其他任何可以向前宣布的内容吗?

1 个答案:

答案 0 :(得分:12)

您可以转发声明

  • 模板,包括部分专业化
  • 明确的专业化
  • 嵌套类(包括结构,“真实”类和联合)
  • 非嵌套和本地类
  • 变量(“extern int a;”)
  • 功能

如果通过“前向声明”您严格意味着“声明但未定义”,您也可以转发声明成员函数。但是一旦声明它们,你就不能在它们的类定义中重新声明它们。您无法转发声明枚举。我不确定我是否错过了什么。

请注意,除了部分和显式特化之外,上面列出的所有前向声明都需要使用非限定名称声明,并且成员函数和嵌套类只能在其类定义中声明但未定义。

class A { };
class A::B; // not legal

namespace A { }
void A::f(); // not legal

namespace A { void f(); } // legal

class B { class C; }; // legal
class B::C; // declaration-only not legal

class D { template<typename T> class E; };
template<typename T> class D::E<T*>; // legal (c.f. 14.5.4/6)