我如何转发声明一个内部类?

可能重复:
C ++中嵌套types/类的前向声明

我有一个这样的class级

class Container { public: class Iterator { ... }; ... }; 

在其他地方,我想通过引用传递一个Container :: Iterator,但我不想包含头文件。 如果我尝试转发声明类,我得到编译错误。

 class Container::Iterator; class Foo { void Read(Container::Iterator& it); }; 

编译上面的代码给出了…

 test.h:3: error: 'Iterator' in class 'Container' does not name a type test.h:5: error: variable or field 'Foo' declared void test.h:5: error: incomplete type 'Container' used in nested name specifier test.h:5: error: 'it' was not declared in this scope 

我怎样才能转发声明这个类,所以我不必包含声明Iterator类的头文件?

这根本不可能。 你不能在容器外部转发声明一个嵌套的结构。 您只能在容器内转发声明。

您需要执行以下任一操作

  • 使类非嵌套
  • 更改您的声明顺序,以便嵌套的类首先被完全定义
  • 创build一个可以在函数中使用并由嵌套类实现的通用基类。

我不相信在一个不完整的类上面声明内部类(因为没有类定义,就没有办法知道实际上是否有内部类)。 所以你必须包含Container的定义,用一个前向声明的内部类:

 class Container { public: class Iterator; }; 

然后在一个单独的头文件中实现Container :: Iterator:

 class Container::Iterator { }; 

然后#只包含容器头(或者不用担心前向声明,只是包含两者)

我知道没有办法做到你想要的,但是这是一个解决方法,如果你愿意使用模板:

 // Foo.h struct Foo { export template<class T> void Read(T it); }; 

 // Foo.cpp #include "Foo.h" #include "Container.h" /* struct Container { struct Inner { }; }; */ export template<> void Foo::Read<Container::Inner>(Container::Inner& it) { } 

 #include "Foo.h" int main() { Foo f; Container::Inner i; f.Read(i); // ok f.Read(3); // error } 

希望这个习惯用法对你有些用处(希望你的编译器是基于EDG的,并实现导出)。

  • Microsoft.visual工作室包没有正确加载
  • 这是什么=! 运营商?
  • #ifdef和#if – 这是更好/更安全的方法来启用/禁用编译特定部分的代码?
  • 转发在c ++中声明一个枚举
  • 为什么在列表<>中添加新值会覆盖列表<>中的以前的值
  • 将参数添加到IDbCommand
  • 无法打开输出文件,权限被拒绝
  • 为什么arrays不能被修剪?
  • 复合键字典
  • ASP.NET MVC获取文本框input值
  • 浮点比较