为了账号安全,请及时绑定邮箱和手机立即绑定

如何转发声明内部类?

如何转发声明内部类?

C++
慕少森 2019-12-12 10:10:45
我有这样的课...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 typetest.h:5: error: variable or field ‘Foo’ declared voidtest.h:5: error: incomplete type ‘Container’ used in nested name specifiertest.h:5: error: ‘it’ was not declared in this scope我该如何转发声明该类,这样就不必包括声明Iterator类的头文件了?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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

您需要执行以下任一操作

  • 将课程设为非嵌套

  • 更改声明顺序,以便首先完全定义嵌套类

  • 创建一个既可以在函数中使用又可以由嵌套类实现的公共基类。



查看完整回答
反对 回复 2019-12-13
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我不相信向前不完整的类作品声明内部类的(因为没有类定义,没有办法知道是否有实际的方式是一个内部类)。因此,您必须包含Container的定义,以及一个前向声明的内部类:


class Container {

public:

    class Iterator;

};

然后在单独的标头中实现Container :: Iterator:


class Container::Iterator {

};

然后#仅包含容器标头(或不必担心前向声明,只需将两者都包含在内)



查看完整回答
反对 回复 2019-12-13
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

我不知道完全按照自己的意愿进行操作,但是,如果您愿意使用模板,则可以采用以下解决方法:


// 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;))。



查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 430 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信