我如何转发声明内部类?

bra*_*ray 145 c++ forward-declaration

可能重复:
在C++中转发嵌套类型/类的声明

我有一个这样的课......

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

    ...
};
Run Code Online (Sandbox Code Playgroud)

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

class Container::Iterator;

class Foo {
    void Read(Container::Iterator& it);
};
Run Code Online (Sandbox Code Playgroud)

编译上面的代码给出了......

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
Run Code Online (Sandbox Code Playgroud)

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

Jar*_*Par 129

这根本不可能.您无法转发在容器外部声明嵌套结构.您只能在容器中转发声明它.

您需要执行以下操作之一

  • 使类非嵌套
  • 更改声明顺序,以便首先完全定义嵌套类
  • 创建一个公共基类,既可以在函数中使用,也可以由嵌套类实现.

  • @Nikerboker他们说嵌套类不能向前声明_outside_容器.链接中的示例是向前声明嵌套类_inside容器的definition_,这是一个不同的场景. (4认同)
  • 公共基类是我最常用的解决方案. (2认同)
  • 那是错的:http://en.cppreference.com/w/cpp/language/nested_types (2认同)
  • 不可能在容器外转发声明嵌套结构的事实似乎是 C++ 中的一个限制,这应该是可能的。对?有什么理由为什么这是不可能的吗? (2认同)

Tod*_*ner 23

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

class Container {
public:
    class Iterator;
};
Run Code Online (Sandbox Code Playgroud)

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

class Container::Iterator {
};
Run Code Online (Sandbox Code Playgroud)

然后#include只包含容器标题(或者不担心前向声明并且只包括两者)

  • 很好的答案,除了第一段括号中的部分."没有办法知道是否确实存在内部阶级"在这种背景下没有意义,并且怀疑是否准确.前向声明的重点是你告诉编译器有一个类(或者在这种情况下,是一个内部类).你的具体陈述与正常的阶段一样,并且意味着你不能转发声明任何东西. (12认同)