可变长度的非POD元素类型'string'(又名'basic_string <char>')c ++ </char>

时间:2012-03-03 23:16:10

标签: c++ arrays xcode string xcode4

我的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 个答案:

答案 0 :(得分:6)

C ++没有C99样式的可变长度数组。您的编译器可能支持它们作为扩展,但它们不是该语言的一部分。在这种特定情况下,您使用Visual Studio的成功表明它确实具有这样的扩展。 clang ++将支持VLA,但仅支持POD类型,因此您尝试生成string个对象的VLA将不起作用。如果我留下足够的警告/错误标志,g ++可以在我的机器上运行。

答案 1 :(得分:3)

这会将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();
}

答案 2 :(得分:0)

抱歉,您需要写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>