代码之家  ›  专栏  ›  技术社区  ›  bradtgmurray

如何转发声明内部类?[复制品]

  •  133
  • bradtgmurray  · 技术社区  · 17 年前

    可能重复:
    Forward declaration of nested types/classes in 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
    

    如何转发声明这个类,这样就不必包含声明迭代器类的头文件了?

    3 回复  |  直到 14 年前
        1
  •  116
  •   JaredPar    17 年前

    这根本不可能。不能在容器外转发声明嵌套结构。只能在容器中转发声明。

    您需要执行以下操作之一

    • 使类非嵌套
    • 更改声明顺序,以便首先完全定义嵌套类
    • 创建一个既可在函数中使用又可由嵌套类实现的公共基类。
        2
  •  20
  •   Todd Gardner    17 年前

    我不相信在一个不完整的类作品上声明的内部类(因为没有类定义,就无法知道是否存在 内部阶级)。因此,您必须包含容器的定义,以及一个正向声明的内部类:

    class Container {
    public:
        class Iterator;
    };
    

    然后在单独的头中,实现container::iterator:

    class Container::Iterator {
    };
    

    然后只包含容器头(或者不担心转发声明,只包含两者)

        3
  •  1
  •   Jason Plank Maksim Kondratyuk    14 年前

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

    // 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并实现export;)。

    推荐文章