2015-09-22 2 views
0

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

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

Я не знаю, если это правильно или нет, но GCC принимает его в то время как лязг и КМК нет. Кто прав и что я могу сделать для компиляции программ с бимап-библиотекой? К сожалению, я не могу использовать gcc в этом случае.

+0

Все звучит так, как будто у вас есть ошибки где-то в другом месте, и это результат предварительной обработки. – Dacav

+0

Этот вопрос не имеет ничего общего с Boost.Bimap. Просто потому, что вы используете его в других частях кода, это не имеет отношения к этому. –

+6

Что ** точно ** это ошибка, которую вы получаете? (И почему вы не сказали нам это в первую очередь?) –

ответ

10

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

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

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

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

Проблема в коде Boost.Bimap - known bug.

+0

Удивительно, спасибо! Да, я использую -Werror –

+0

Я связался с этим ответом из моего вопроса [здесь] (http://stackoverflow.com/questions/32715610/is-a-forward-declaration-allowed-after-a-class-definition) – alain