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