我在编译boost.bimap库时遇到问题。我的测试程序是一个空白的主函数,只有一个include指令(如#include <boost/bimap.hpp>
)。
经过一些调查后,我发现预处理器已经从头文件中做了一些有趣的构造,如:
struct A { struct B{}; struct B; };
我不知道这是否正确,但gcc接受它而clang和icc不接受。谁是对的,我该怎么做才能用bimap库编译程序?不幸的是,在这种情况下我不能使用gcc。
答案 0 :(得分:10)
struct B{};
定义了一个嵌套类,然后struct B;
是对同一嵌套类的重新声明。
GCC接受代码(bug report)是错误的,因为标准在[class.mem]中说:
成员不得在 member-specification 中声明两次,除非可以声明嵌套类或成员类模板,然后再定义,
在您的情况下,嵌套类被定义为然后声明,这是不允许的,因此Clang和ICC对于提供诊断是正确的。但是,当我测试它时,它们只会发出警告,而不是错误,所以也许你正在使用-Werror
,在这种情况下停止这样做,代码应该编译。
Boost.Bimap代码中的问题是known bug。