2013-05-02 4 views
4

Я пытаюсь скомпилировать код C++ (который можно скомпилировать с помощью Visual Studio 2012 в Windows) с помощью g++-4.4.Ошибка: ожидаемый инициализатор перед ':' token

У меня есть этот фрагмент кода,

const std::string cnw::restoreSession(const std::vector<string> &inNwsFile) { 
    for (std::string &nwFile : inNwsFile){ 
     // some... 
    } 
} 

, что я не могу скомпилировать из-за этой ошибки:

CNWController.cpp:154: error: expected initializer before ‘:’ token 

Можете ли вы дать мне некоторые рекомендации о том, как решить эту проблему?

+0

Почему вы используете двоеточие вместо полуколонии в цикле for? – 0x499602D2

+3

@ 0x499602D2: Потому что это синтаксис для диапазона C++ 11 на основе 'for'. –

ответ

12

Ваш компилятор слишком стар, чтобы поддерживать синтаксис for на основе диапазона. Согласно GNU, он был впервые поддержан в GCC 4.6. GCC также требует, чтобы вы явно запрашивали поддержку C++ 11, предоставляя опцию командной строки -std=c++11 или c++0x на компиляторах, таких же старых, как ваши.

Если вы не можете обновить, то вы будете нуждаться в старой школе эквиваленте:

for (auto it = inNwsFile.begin(); it != inNwsFile.end(); ++it) { 
    std::string const &nwFile = *it; // const needed because inNwsFile is const 
    //some... 
} 

Я считаю, auto доступен в GCC 4.4 (до тех пор, как вы включите C++ 0x поддержка), чтобы сохранить вас написание std::vector<string>::const_iterator.

Если вам действительно нужна ссылка на элементы вектора, то в зависимости от того, какой стиль цикла вы используете, вам нужно удалить const из параметра функции.

+2

При компиляции ему также может понадобиться флаг '-std = C++ 11'. – olevegard

+3

@olevegard: В самом деле, хотя это строчные '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' –

+0

Спасибо, Майк, это сработало. Да, я должен использовать 'C++ 0x', флаг' C++ 11' не поддерживается моим компилятором. – Aslan986

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