У меня проблема с компиляцией библиотеки boost.bimap. Моя тестовая программа — пустая основная функция и только одна директива include (например, #include <boost/bimap.hpp>
).
После некоторых исследований я обнаружил, что препроцессор сделал несколько интересных конструкций из заголовочного файла, таких как:
struct A { struct B{}; struct B; };
Я не знаю, правильно ли это или нет, но gcc принимает это, а clang и icc — нет. Кто прав и что я могу сделать, чтобы компилировать программы с библиотекой bimap? К сожалению, я не могу использовать gcc в этом случае.
struct B{};
определяет вложенный класс, то struct B;
это повторное объявление того же вложенного класса.
GCC неправильно принимает код (сообщение об ошибке), потому что стандарт говорит в [class.mem]:
Член не должен быть объявлен дважды в член-спецификация, за исключением того, что вложенный класс или шаблон класса-члена могут быть объявлены и затем определены позже,
В вашем случае определяется вложенный класс затем заявлено, что недопустимо, поэтому Clang и ICC правильно ставят диагноз. Однако, когда я проверяю его, они выдают только предупреждение, а не ошибку, так что, возможно, вы используете -Werror
, в этом случае прекратите делать это, и код должен скомпилироваться.
Проблема в коде Boost.Bimap заключается в известная ошибка.