2012-03-03 27 views
1

我在我的C++代码中得到这个错误非POD元素类型变量长度数组string(又名basic_string<char>)。非POD元素类型“字符串”(又名'basic_string <char>')的可变长度数组C++

string words[numWords]; 

如果我摆脱NUMWORDS和输入号码能正常工作,但如果我把一个变量相同数量的它给我的Variable length array of non-POD element type 'string' (aka 'basic_string<char>')错误,我已经这样做之前,它在视觉工作室工作但我现在已经在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(); 
+1

这与* Xcode有*无关。它与你正在使用的编译器有关。某些版本的gcc我认为? gcc -version'说什么? – Irfy 2012-03-03 23:18:33

+0

你可以发布你的'vector'代码吗? – hmjd 2012-03-03 23:19:40

+3

对数组大小使用变量不是标准。使用矢量应该工作,所以真正的问题是找到为什么这不适合你。 – 2012-03-03 23:20:24

回答

3

这初始化wordsnumWords空字符串,然后追加实际字符串算账:

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

我已经尝试了你的两个解决方案,但一个抛出异常,另一个仍然没有打印任何东西,认为它可能是我的电脑或一个愚蠢的错误 – bobthemac 2012-03-03 23:43:17

+0

我认为你需要在第二个'while'之前重新打开'repFile'。 – hmjd 2012-03-03 23:45:34

+0

@bobthemac,更新了另一个选择的答案。 – hmjd 2012-03-03 23:50:24

6

C++没有C99风格变长数组。你的编译器可能支持它们作为扩展,但它们不是该语言的一部分。在这个特定的情况下,你用Visual Studio取得的成功表明它确实具有这样的扩展。铿锵声++将支持VLA,但只支持POD类型,所以你尝试制作一个VLA为string的对象将不起作用。如果我留下足够的警告/错误标志,g ++可以在我的机器上工作。

+0

或者它可能只是因为动态值被用来初始化一个'const int',并且VS未能发现该值不是静态产生的,为了警告/错误。我见过它发生。 – 2012-03-03 23:28:43

+0

可能。我对Visual Studio几乎一无所知。 – 2012-03-03 23:29:43

+0

我也在GCC看过它。 IMO意外使用扩展名的可能性更大。 – 2012-03-03 23:42:27

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>

相关问题