Я пытаюсь включить 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
Наиболее вероятное объяснение — это что-то вроде: один из ваших файлов заголовков отсутствует, включая стражу (или у включенного охранника есть опечатка), и вы фактически дважды включаете какой-то заголовок повышения. (Не все заголовки повышения в отдельности имеют охранников. Те, которые вы должны включать, делают, но некоторые из них просто не «по соображениям эффективности», как мне сказали.)
Или то, что вы включаете повышение внутри пространства имен где-то, от чего оно не может реально защитить себя.
Эта ошибка 'boost::iterators::detail::postfix_increment_result': too few template arguments
это именно то, что я ожидал бы, если бы это было какое-то определение шаблона и компилятор встретил определение во второй раз.