在定义成员类之后重新声明它是否合法?

Is it legal to re-declare a member class after defining it?

本文关键字:是否 声明 成员类 定义 之后 新声明      更新时间:2023-10-16

我有一个编译boost的问题。bimap图书馆。我的测试程序是一个空白的主函数,只有一个包含指令(如#include <boost/bimap.hpp>)。经过一番调查,我发现预处理器从头文件中做出了一些有趣的结构,如:

struct A { struct B{}; struct B; };

我不知道这是否正确,但是gcc接受它,而clang和icc不接受。谁是对的,我可以做些什么来编译程序与bimap库?不幸的是,在这种情况下我不能使用gcc。

struct B{};定义了一个嵌套类,那么struct B;是同一个嵌套类的重新声明。

GCC接受代码是错误的(bug报告),因为标准在[class.mem]中说:

成员不能在成员规范中声明两次,除非可以声明嵌套类或成员类模板,然后再定义,

在您的例子中,嵌套类是定义然后声明的,这是不允许的,因此Clang和ICC给出诊断是正确的。然而,当我测试它时,他们只给出一个警告,而不是一个错误,所以也许你正在使用-Werror,在这种情况下停止这样做,代码应该编译。

Boost中的问题。Bimap代码是一个已知的bug