如何转发声明内部类?

我有这样的课...


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类的头文件了?


一只名叫tom的猫
浏览 398回答 3
3回答

慕勒3428872

这根本不可能。您不能在容器外部转发声明嵌套结构。您只能在容器内转发声明。您需要执行以下任一操作将课程设为非嵌套更改声明顺序,以便首先完全定义嵌套类创建一个既可以在函数中使用又可以由嵌套类实现的公共基类。

慕雪6442864

我不相信向前不完整的类作品声明内部类的(因为没有类定义,没有办法知道是否有实际的方式是一个内部类)。因此,您必须包含Container的定义,以及一个前向声明的内部类:class Container {public:    class Iterator;};然后在单独的标头中实现Container :: Iterator:class Container::Iterator {};然后#仅包含容器标头(或不必担心前向声明,只需将两者都包含在内)

慕标5832272

我不知道完全按照自己的意愿进行操作,但是,如果您愿意使用模板,则可以采用以下解决方法:// Foo.h&nbsp;&nbsp;struct Foo{&nbsp; &nbsp;export template<class T> void Read(T it);};// Foo.cpp#include "Foo.h"#include "Container.h"/*struct Container{&nbsp; &nbsp; struct Inner { };};*/export template<>&nbsp;&nbsp; void Foo::Read<Container::Inner>(Container::Inner& it){}#include "Foo.h"int main(){&nbsp; Foo f;&nbsp; Container::Inner i;&nbsp; f.Read(i);&nbsp; // ok&nbsp; f.Read(3);&nbsp; // error}希望该惯用法可能对您有所帮助(并希望您的编译器基于EDG并实现export;))。
打开App,查看更多内容
随时随地看视频慕课网APP