Массив переменной длины не-POD элемента типа 'string' (он же basic_string <char>') c ++ - PullRequest
1 голос
/ 04 марта 2012

Я получаю эту ошибку в своем коде c ++. Массив переменной длины с типом элемента, отличного от POD string (он же basic_string<char>).

string words[numWords];

Если я избавлюсь от numWords и введу это числоработает нормально, но если я помещаю одно и то же число в переменную, это дает мне ошибку Variable length array of non-POD element type 'string' (aka 'basic_string<char>'), я делал это раньше, и это работало в visual studio, но сейчас я попробовал это в Xcode, и это не работает.Я пытался использовать векторы, но не могу получить их, так что они не хранят никаких данных, и они просто возвращаются пустыми.

Для тех, кто спросил, это мой векторный код, все должны быть там

char ch;

ifstream repFile("//Users//bobthemac//Documents//c++asignment//c++asignment//test1.txt");

while(repFile.get(ch))
{
    if(ch == ' ' || ch == '\n' || ch == '\t')
    {
        numWords++;
    }
}

vector<string> words (numWords);

while(repFile >> x)
    words.push_back(x);
repFile.close();

Ответы [ 3 ]

6 голосов
/ 04 марта 2012

C ++ не имеет массивов переменной длины в стиле C99.Ваш компилятор может поддерживать их как расширение, но они не являются частью языка.В этом конкретном случае ваш успех в Visual Studio показывает, что у него действительно есть такое расширение.Clang ++ будет поддерживать VLA, но только типов POD, поэтому ваша попытка создать VLA из string объектов не будет работать.g ++ работает на моей машине, если я уберу достаточно флагов предупреждений / ошибок.

3 голосов
/ 04 марта 2012

Это инициализирует words с numWords пустыми строками, а затем добавляет фактические строки:

vector<string> words (numWords);

while(repFile >> x)
    words.push_back(x);

Измените на:

vector<string> words;

while(repFile >> x)
    words.push_back(x);

или:

vector<string> words (numWords);

int idx = 0;
while(repFile >> x /* && idx < numWords */)
    words[idx++] = x;

РЕДАКТИРОВАТЬ:

Нет смысла подсчитывать количество слов до заполнения vector:

vector<string> words;
ifstream repFile("//Users//bobthemac//Documents//c++asignment//c++asignment//test1.txt");
if (repFile.is_open())
{
    while(repFile >> x)
    {
        words.push_back(x);
    }
    repFile.close();
}
0 голосов
/ 04 марта 2012

Извините, вам нужно написать gcc --version, чтобы получить версию.

Как утверждают другие, вы не должны использовать массивы переменной длины, но GCC поддерживает их как расширение в C ++. Мой GCC 4.4.4 прекрасно компилируется со следующим кодом:

#include <string>
#include <iostream>
using namespace std;

int main() {
  int n;
  cin >> n;
  string s[n];
  return 0;
}

Этот код компилируется для вас? Если это так, то вам нужно дать нам самый маленький фрагмент кода, который не работает.

Лучшее решение, однако, это использовать vector<string>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...