我的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();
答案 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>
。