Ошибка компиляции из-за синтаксической ошибки в заголовочном файле

У меня есть программа, которая опирается на несколько включаемых файлов. Когда я определяю, включает в порядке, показанном ниже, программа компилируется нормально.

#include <iostream>
#include "opencv2/cvconfig.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/core/internal.hpp" // For TBB wrappers
#include "arrayfire.h"

Тем не менее, когда я переключаю последние два включает, как показано ниже

#include <iostream>
#include "opencv2/cvconfig.h"#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "arrayfire.h"#include "opencv2/core/internal.hpp" // For TBB wrappers

Я получаю ошибки компилятора:

1> d: \ library \ tbb41 \ tbb41_20130613oss \ include \ tbb \ task.h (765): ошибка
C2059: синтаксическая ошибка: ‘{‘
1> d: \ library \ tbb41 \ tbb41_20130613oss \ include \ tbb \ task.h (765): ошибка
C2334: неожиданный токен (ы), предшествующий ‘{‘; пропуск видимой функции
тело

Это неожиданно, и я бы хотел это исправить. Все включения из библиотек (OpenCV и ArrayFire). Любые предложения о том, что может быть причиной и как решить эту проблему?

редактировать Вот соответствующая часть task.h:

759 #if __TBB_TASK_GROUP_CONTEXT
760    //! This method is deprecated and will be removed in the future.
761    /** Use method group() instead. **/
762    task_group_context* context() {return prefix().context;}
763
764    //! Pointer to the task group descriptor.
765    task_group_context* group () { return prefix().context; }
766 #endif /* __TBB_TASK_GROUP_CONTEXT */

В строке 765 IDE жалуется на {говоря Error: expected an identifier

0

Решение

Это вызвано следующим злом в одном из Заголовки ArrayFire:

#define group(...)  __VA_ARGS__

Это определяет подобный функции макрос, который заменяется списком аргументов макроса; group(a,b) расширяется до a,bи (что более важно здесь) group() расширяется в ничто. Поскольку макросы не уважают понятия уровня языка, такие как области действия, это мешает более позднему объявлению:

task_group_context* group () { return prefix().context; }

превращая его в

task_group_context* { return prefix().context; }

которая не является действительной декларацией.

Исправление должно включать "arrayfire.h" наконец, и будьте осторожны, какие имена вы пытаетесь использовать в своем собственном коде; или #undef group (и любое другое зло, которое оно может совершить) после включения его. Или, если возможно, убейте его огнем и используйте вместо этого что-то меньшее.

4

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

Других решений пока нет …