Почему я получаю ошибки компиляции в iterator_facade в зависимости от того, куда я помещаю свой заголовок Boost?

Я пытаюсь включить Boost в свой существующий проект среднего размера. У меня есть предварительно скомпилированный заголовочный файл, stdafx.hгде я храню все свои C ++ stdlib #include директивы (плюс некоторые заголовки Windows), и многие .cpp файлы, которые включают stdafx.h, среди них A.cpp, Это включает stdafx.h в самой первой строке, затем некоторые другие заголовки, необходимые только для этого файла. Я хотел использовать boost::program_options в A.cppпоэтому я добавил это в список включения сразу после stdafx.hтак что верх A.cpp выглядело так:

#include "stdafx.h"
#include <boost/program_options.hpp>

// more #includes

Затем я приступил к компиляции проекта, но обнаружил следующие ошибки:

Severity    Code    Description Project File    Line
Error   C2976   'boost::iterators::detail::postfix_increment_result': too few template arguments    testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  789
Error   C1903   unable to recover from previous error(s); stopping compilation  testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2143   syntax error: missing ';' before '++'   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  534
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  541
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  600
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  606
Error   C2059   syntax error: ','   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  789
Error   C4430   missing type specifier - int assumed. Note: C++ does not support default-int    testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2433   'type': 'inline' not permitted on data declarations testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2888   'if_<T1,T2,T3>::type type': symbol cannot be defined within namespace 'iterators'   testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  790
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  534
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  541
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  600
Error   C2976   'boost::iterators::iterator_facade': too few template arguments testProject C:\boost_1_59_0\boost\iterator\iterator_facade.hpp  606

Я немного поэкспериментировал и обнаружил, что если я поставлю

#include <boost/program_options.hpp>

на самый конец из stdafx.h — последние строки — все компилируется нормально, но если я попытаюсь поместить его где-нибудь в A.cppЯ получаю вышеуказанные ошибки. Я не очень понимаю, как это возможно; Разве препроцессор не выполняет бессмысленную вставку, и в этом случае тот же самый вывод должен быть передан компилятору после того, как препроцессор выполнит свою работу? В чем может быть причина? Я искал вокруг, но я нашел сообщения только людей, которые на самом деле хотели использовать iterator_facade и получали ошибки в своем коде, а не в заголовках Boost.

Мой конфиг:
VS 2015 на Windows 8.1, Boost 1.59.0, проект x86, построенный с /MT

ОБНОВИТЬ: Это также работает, если я включу этот заголовок в оба A.cpp а также stdafx.h,

UPDATE2: Интересно, что это то, что у меня в окне вывода после сбоя компиляции:

1>  INTERNAL COMPILER ERROR in 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\CL.exe'
1>      Please choose the Technical Support command on the Visual C++
1>      Help menu, or open the Technical Support help file for more information

1

Решение

Наиболее вероятное объяснение — это что-то вроде: один из ваших файлов заголовков отсутствует, включая стражу (или у включенного охранника есть опечатка), и вы фактически дважды включаете какой-то заголовок повышения. (Не все заголовки повышения в отдельности имеют охранников. Те, которые вы должны включать, делают, но некоторые из них просто не «по соображениям эффективности», как мне сказали.)

Или то, что вы включаете повышение внутри пространства имен где-то, от чего оно не может реально защитить себя.

Эта ошибка 'boost::iterators::detail::postfix_increment_result': too few template arguments это именно то, что я ожидал бы, если бы это было какое-то определение шаблона и компилятор встретил определение во второй раз.

0

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


По вопросам рекламы ammmcru@yandex.ru