【问题标题】:What can I "forward declare" in C++?我可以在 C++ 中“前向声明”什么?
【发布时间】:2010-09-26 21:11:14
【问题描述】:

我知道我能做到

class Foo;

而且可能

struct Bar;

和全局函数

bool IsValid(int iVal);

类型化的枚举呢?未声明的类中的类型化枚举呢?带有未声明类的函数呢?未声明的类中的静态成员呢?这些在未知命名空间中的情况如何?我是否遗漏了其他可以提前声明的内容?

【问题讨论】:

  • 何不试试看?
  • extern int globalVar; 其中 globalVar 在单独的编译单元中声明。
  • enum 将能够在 C++0x 中转发声明。并且您不能“部分”前向声明类(方法的前向声明)
  • 我倾向于将类型化枚举放在“定义”它们的类中。然后,我遇到了两个引用彼此枚举的类的“循环依赖”编译器问题。

标签: c++ forward-declaration


【解决方案1】:

你可以转发声明

  • 模板,包括部分专业化
  • 明确的专业化
  • 嵌套类(包括结构、“真实”类和联合)
  • 非嵌套类和本地类
  • 变量(“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)

【讨论】:

  • 我想你忘记了 C++0x 中的新 enum class。如果我没记错的话,精确底层表示的目的是使它可以向前声明。
  • 前向声明部分专业化有什么意义吗?部分特化在名称查找期间不可见,并且在模板的实例化点被解析 - 在这一点上它们必须被完全定义。
  • @willj 允许在某些上下文(前向声明)中没有错误地使用未定义的模板,但在定义模板时进行实例化。参数类型与部分特化相关联的 ADL 调用就是一个示例。如果您没有转发声明它但已经定义了主模板,那么主模板将被实例化。
  • @litb 你能举个例子吗?这里的问题:stackoverflow.com/questions/17200312/…
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多