2014-02-21 4 views
-1

Когда я пытаюсь использовать vector.size(), это дает мне следующие ошибки:Почему функция vector.size() дает мне ошибку?

In function 'int main()': 
[Error] expected unqualified-id before '(' token 
[Error] expected primary-expression before ')' token 
[Error] lambda-expression in unevaluated context 
[Error] expected identifier before numeric constant 
In lambda function: 
[Error] expected '{' before ')' token 

Остальное вектор функция работает. Я использовал эту функцию раньше, и она работала, теперь я не могу ее использовать.

вот код:

while(1) 
{ 
    vector<string> frase; 
    string stringa; 
    getline(cin,stringa); 
    { 
      string temp; 
      temp.clear(); 
      for(int i=0;i<stringa.length();i++) 
      { 
       if(stringa[i]!=' ')temp+=stringa[i]; 
       else 
       { 
        frase.push_back(temp); 
        temp.clear(); 
       } 
      } 
      frase.push_back(temp); 
    } 


    analizza(frase.data(), /*ERROR HERE*/ frase.size() /*ERROR HERE*/); 

      frase.clear(); 


    for(int i=0;i<frase.size();i++)frase.pop_back(); 
} 

что я могу сделать?

+0

Справедливо ли считать, что вы используете класс 'std :: string'? И 'std :: vector', если на то пошло? – patrickvacek

+0

Да, я. Также я включил и NetHacker

+3

Вы должны убедиться, что указали, в какую строку включена ошибка, но это выглядит неправильно: 'string parole [frase.size()];' Вы не можете объявить массив с не- Уст. – crashmstr

ответ

6

Вы пытаетесь объявить массив с размером выполнения здесь:

string parole[frase.size()]; 

C++ не поддерживает это. Кажется, что ваш компилятор интерпретирует это как выражение лямбда вместо этого.

Вам совсем не нужен массив - просто используйте frase. Или, если ваша функция действительно нужно принимать указатель в качестве входных данных, используйте frase.data():

while(1) 
{ 
    vector<string> frase; 
    string stringa; 
    getline(cin,stringa); 
    { 
     //same as before 
    } 

    analizza(frase.data(), frase.size()); 

    frase.clear(); 
} 
+0

это дает мне те же ошибки. – NetHacker

+0

@NetHacker Он не может дать точно такие же ошибки, потому что оскорбительная строка отсутствует в моем Возможно, вы можете отредактировать вопрос и добавить строку * exact * ошибки. Я имею в виду, пометьте ее в коде комментарием или чем-то другим. [SSCCE] (http://www.sscce.org/) еще лучше, что-то, что мы могли бы скопировать и вставить, например, [ideone] (http://ideone.com/), и сами увидеть ошибку. – Angew

+0

Так что мне нужно вставить весь код? – NetHacker

0

У вас есть несколько проблем с вашим кодом в целом:

Парсинг

string stringa; 
getline(cin,stringa); 
{ 
     string temp; 
     temp.clear(); 
     for(int i=0;i<stringa.length();i++) 
     { 
      if(stringa[i]!=' ')temp+=stringa[i]; 
      else 
      { 
       frase.push_back(temp); 
       temp.clear(); 
      } 
     } 
     frase.push_back(temp); 
} 

Этот блок кода совершенно не нужно. Вся логика может быть выполнена следующим образом:

std::string line; 
std::getline(std::cin, line); 
std::istringstream iss(line); 
std::istream_iterator<std::string> start(iss); 
std::istream_iterator<std::string> end; 
std::vector<std::string> v(start, end); 

массивов переменной длиной

Влас не является стандартным (некоторые компиляторы имеют их как продолжение, но это не портативные). Следующий код не будет компилироваться на стандартный компилятор:

string parole[frase.size()]; 

Вместо этого, если вы хотите массив неопределенного размера, вы используете std::vector (который у вас уже есть, так что нет необходимости делать что-либо). Если функция, которую вы пытаетесь вызвать, требует указателя, вы можете использовать v.data() (если вы используете компилятор, который поддерживает C++ 11) или &v[0] (если вам нужно скомпилировать под стандартом C++ 03).

+0

Хорошо, я понимаю часть о VLA. Я не совсем понимаю часть раньше, она создает вектор с словами линии (без пробелов)? Я никогда не видел istrinstream и iss(). – NetHacker

+1

@NetHacker Вы просто пишете гораздо больше кода, чем вам нужно, чтобы достичь своей цели. 'std :: istream' будет анализировать строки, разделенные пробелами, используя' operator >> '(так же, как вы делаете с' std :: cin'). 'std :: istringstream' позволяет вам указать' std :: string', который будет обрабатываться как 'std :: istream' (который я назвал' iss', но может быть любым допустимым именем). Объявления итератора - это просто указать начальную точку и конечную точку для конструктора 'std :: vector' (http://www.cplusplus.com/reference/vector/vector/vector/) (перегрузка # 3), который принимает итераторы. –

+0

Хорошо. Теперь я понимаю. – NetHacker

0

Если вам нужен массив строк вместо вектора, вы должны использовать char [] или char * и выделять динамически. Вы не можете создать размер массива с переменной.

+0

Нет, он мог бы использовать 'std :: string * = new std :: string [v.size()]', но 'std :: vector ' - превосходный подход. Если бы он не собирался использовать стандартные классы, это был бы 'char **', а не 'char *'. –

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