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

时间:2015-09-22 08:28:16

标签: c++ c-preprocessor bimap boost-bimap

我在编译boost.bimap库时遇到问题。我的测试程序是一个空白的主函数,只有一个include指令(如#include <boost/bimap.hpp>)。 经过一些调查后,我发现预处理器已经从头文件中做了一些有趣的构造,如:

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

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

1 个答案:

答案 0 :(得分:10)

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

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

  

成员不得在 member-specification 中声明两次,除非可以声明嵌套类或成员类模板,然后再定义,

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

Boost.Bimap代码中的问题是known bug