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