Повышение foreach конфликтует с Q_FOREACH (Qt) и генерацией moc?

У меня есть программа, отредактированная в 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.

Но я не знаю, как решить эту проблему?

2

Решение

Установка флага компилятора -DQT_NO_KEYWORDS, отключает конфликт между boost и qt!

Но тогда вам нужно заменить ключевые слова qt в вашем коде, как slots, signals, emit …, увидеть эта почта.

(Я получил это сообщение, когда представил контейнер boost :: multi_index в моем проекте.)

  • (Для проектов qmake CONFIG += no_keywords Является ли это.)
  • (Для проекта cmake add_definitions(-DQT_NO_KEYWORDS) Является ли это.)
1

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

Проблема в том, что 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>,

1

По вопросам рекламы [email protected]