我如何转发声明一个内部类?
  可能重复: 
  C ++中嵌套类型/类的前向声明 
我有这样的班级...
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类的头文件?
这根本不可能。 您不能在容器外部转发声明嵌套结构。 您只能在容器内转发声明。
您需要执行以下任一操作
我不相信在一个不完整的类中声明内部类(因为没有类定义,就没有办法知道实际上是否有内部类)。 所以你必须包含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的并且实现导出;))。
链接地址: http://www.djcxy.com/p/95527.html