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

У меня проблема с компиляцией библиотеки 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 - известная ошибка.

Другие вопросы по тегам