2014-11-06 3 views
1

Теперь я пытаюсь установить RealPlexor по dklab, но падает с ошибками:C++ ошибка: ожидается, первичное выражение, прежде чем '[' лексема

# bash ./Make.sh 
In file included from dklab_realplexor.cpp:68: 
utils/misc.h: In function ‘void die(std::string)’: 
utils/misc.h:105: error: expected primary-expression before ‘[’ token 
compilation terminated due to -Wfatal-errors. 

Вот та линия

s = regex_replace(s, regex("\\$!"), [](smatch s) { return strerrno(); }); 
+0

Какая строка предшествует этой? – DavidO

+3

Ваша * определенная * ваша инструментальная цепочка: (a) компиляция с соблюдением C++ 11 и (b) поддержка lamdas ? – WhozCraig

+0

@DavidO void die (string s) { s = regex_replace (s, regex ("\\ $!"), * (Smatch s) {return strerrno();}); throw runtime_error (s); } –

ответ

2

Убедитесь, что вы передаете следующий флаг компилятора (как описаны в the g++ documentation):

-std=c++11 

Это говорит компилятору GCC (г ++) для компиляции коды с C++ 11 семантики.

Синтаксис выражения лямбда-выражения, который вы используете (часть, начинающаяся с []), является функцией C++ 11 и вызовет компиляторы с большой путаницей, если она появится в коде, что они не ожидали быть C++ 11.

Однако, как было указано в другом комментарии здесь (и подтверждено this table, версия gcc, в которой вы работаете (4.4.5, за комментарий), не поддерживает поддержку лямбда-выражения. вместо этого следует использовать объект функции или обновить до более новой версии gcc/g ++.

+0

Не работает, падает с '# bash ./Make.sh В файл включен из dklab_realplexor.cpp: 68: 0: utils/misc.h: В функции 'void die (std :: string)': utils/misc.h: 105: 50: ошибка: ожидаемое первичное выражение перед 's' компиляция завершена из-за ошибок -Wfatal. ' –

+0

Если вы все еще испытываете ошибку после обновления g ++ до 4.7, то вы не используете флаг' -std = C++ 11', как описано в https://gcc.gnu.org/onlinedocs/gcc /Standards.html, и, судя по некоторым другим вашим комментариям, я бы сказал, что вам, вероятно, нужно будет установить Make.sh для создания соответствующих флагов в make-файле проекта. – DavidO

+0

Например, создайте простейшую программу C++ 11, в которой используется простая функция C++ 11. Скомпилируйте его с помощью 'g ++ -std = C++ 11 mytest.cpp -o mytest', и вы можете убедиться в себе в более простой среде, в которой работает флаг компилятора. – DavidO

0

Просто сказать

s = regex_replace(s, regex("\\$!"), *(smatch s) { return strerrno(); }); 

оператор [] обычно используется индексировать что-то (как массив символов), так что C + + Ожидает чего-то перед ним

попробовать Также это предложение от @DavidO:

Вы используете лямбда-выражение, которое синтаксис С ++ 11, но, вероятно, не установили компилятор распознавать C++ 11. Если вы используете g ++, вы должны использовать флаг -std=c++11.

+0

теперь его падает с '# bash ./Make.sh В файле, включенном в dklab_realplexor.cpp: 68: utils/misc.h: В функции 'void die (std :: string)': utils/misc.h: 105: ошибка: ожидаемое первичное выражение перед 's' компиляция завершена из-за -Wfatal-errors. ' –

+0

Вам нужно добавить больше кода –

+0

Использует' * (smatch s) {return strerrno(); } 'новый способ указать lambdas в C++? –

Смежные вопросы