У меня есть программа, отредактированная в Vs 2008 с использованием некоторых библиотек, таких как Qt и Point Cloud Library (PCL).
PCL имеет стороннюю библиотеку, которая содержит boost.
Однако некоторые ошибки появились после компиляции:
1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost, \ включать \ наддува / multi_index / sequenced_index.hpp (926)
: ошибка C3083: «Q_FOREACH»: символ слева от «::» должен быть
введите 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost, \ включать \ наддува / multi_index / sequenced_index.hpp (926)
: ошибка C2039: «тег»: не является членом «boost» 1> C: \ Program
Файлы \ PCL
1.5.1 \ 3rdParty \ Boost, \ включать \ наддува / multi_index / sequenced_index.hpp (926)
: ошибка C2061: синтаксическая ошибка: идентификатор «тег» 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / order_index.hpp (1399): ошибка C3083: «Q_FOREACH»: символ слева от «::» должен быть
введите 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / orders_index.hpp (1399): ошибка C2039: ‘tag’: не является членом ‘boost’ 1> C: \ Program
Файлы \ PCL
1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / order_index.hpp (1399): ошибка C2061: синтаксическая ошибка: идентификатор тега 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / hashed_index.hpp (1254): ошибка C3083: «Q_FOREACH»: символ слева от «::» должен быть
введите 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / hashed_index.hpp (1254): ошибка C2039: ‘tag’: не является членом ‘boost’ 1> C: \ Program
Файлы \ PCL
1.5.1 \ 3rdParty \ Boost \ include \ boost / multi_index / hashed_index.hpp (1254): ошибка C2061: синтаксическая ошибка: идентификатор тега 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost, \ включать \ наддува / multi_index / random_access_index.hpp (1012)
: ошибка C3083: «Q_FOREACH»: символ слева от «::» должен быть
введите 1> C: \ Program Files \ PCL
1.5.1 \ 3rdParty \ Boost, \ включать \ наддува / multi_index / random_access_index.hpp (1012)
: ошибка C2039: «тег»: не является членом «boost» 1> C: \ Program
Файлы \ PCL
1.5.1 \ 3rdParty \ Boost, \ включать \ наддува / multi_index / random_access_index.hpp (1012)
: ошибка C2061: синтаксическая ошибка: идентификатор «тег»
Для первой проблемы местоположение ошибки в исходном файле:
template<typename SuperMeta,typename TagList>
inline boost::mpl::true_* boost_foreach_is_noncopyable(
boost::multi_index::detail::random_access_index<SuperMeta,TagList>*&,
boost::foreach::tag) // <-------------error here for the first compile error.
{
return 0;
}
Я думаю, может быть, это указывает на то, что Q_FOREACH
конфликтует с бустом foreach.
Но я не знаю, как решить эту проблему?
Установка флага компилятора -DQT_NO_KEYWORDS
, отключает конфликт между boost и qt!
Но тогда вам нужно заменить ключевые слова qt в вашем коде, как slots
, signals
, emit
…, увидеть эта почта.
(Я получил это сообщение, когда представил контейнер boost :: multi_index в моем проекте.)
CONFIG += no_keywords
Является ли это.)add_definitions(-DQT_NO_KEYWORDS)
Является ли это.)Проблема в том, что Qt определяет foreach
макрос (#define foreach Q_FOREACH
) который конфликтует с boost::foreach
Пространство имен.
Самый простой способ решить эту проблему — включить Boost перед Qt или просто отменить определение макроса Qt перед включением заголовочного файла boost. Я предпочитаю второе, так как оно не потребует дополнительной документации (// remember to include Boost before Qt
), и легче управлять вложенными заголовочными файлами и использовать предварительно скомпилированные заголовки.
#undef foreach
#include <boost/foreach.hpp>
Эта опция менее инвазивна, чем отключение ключевых слов Qt (флаг компиляции -DQT_NO_KEYWORDS
) и может применяться только в затронутых файлах, если требуется. Это не повлияет на использование Q_FOREACH
(очевидно, если вы используете Qt’s foreach
это не удастся). Также работает независимо, что Qt включен до или после <boost/foreach.hpp>
,