Законно ли повторно объявлять класс-член после его определения?

У меня проблема с компиляцией библиотеки boost.bimap. Моя тестовая программа — пустая основная функция и только одна директива include (например, #include <boost/bimap.hpp>).
После некоторых исследований я обнаружил, что препроцессор сделал несколько интересных конструкций из заголовочного файла, таких как:

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

Я не знаю, правильно ли это или нет, но gcc принимает это, а clang и icc — нет. Кто прав и что я могу сделать, чтобы компилировать программы с библиотекой bimap? К сожалению, я не могу использовать gcc в этом случае.

0

Решение

struct B{}; определяет вложенный класс, то struct B; это повторное объявление того же вложенного класса.

GCC неправильно принимает код (сообщение об ошибке), потому что стандарт говорит в [class.mem]:

Член не должен быть объявлен дважды в член-спецификация, за исключением того, что вложенный класс или шаблон класса-члена могут быть объявлены и затем определены позже,

В вашем случае определяется вложенный класс затем заявлено, что недопустимо, поэтому Clang и ICC правильно ставят диагноз. Однако, когда я проверяю его, они выдают только предупреждение, а не ошибку, так что, возможно, вы используете -Werror, в этом случае прекратите делать это, и код должен скомпилироваться.

Проблема в коде Boost.Bimap заключается в известная ошибка.

10

Другие решения