2010-12-22 74 views
2


我試圖編譯這個代碼片段,但我得到了編譯器錯誤:(與Visual Studio編譯2010無法訪問矢量

#include <vector> 
#include <string> 
#include <sstream> 
#include <iterator> 
#include <iostream> 

using namespace std; 

int main() { 
    string s("Well well on"); 
    istringstream in(s); 
    vector<string> v(istream_iterator<string>(in), istream_iterator<string>()); 
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n")); 
} 

錯誤:

Error 1 error C2228: left of '.begin' must have class/struct/union c:\visual studio 2008 projects\vector test\vector test\main.cpp 13 vector test 
Error 2 error C2228: left of '.end' must have class/struct/union c:\visual studio 2008 projects\vector test\vector test\main.cpp 13 vector test 

什麼發生了什麼?矢量構建正確,我怎麼能不能稱之爲它?

此致敬禮,

+0

你應該看看「The Definitive C++ Book Guide and List」http://stackoverflow.com/questions/38824 2/the-definitive-C++ - book-guide-and-list,「Effective STL」,尤其是 – 2010-12-22 17:28:58

+0

再次感謝sbi;) – Chan 2010-12-22 18:21:53

回答

6

我覺得這

vector<string> v(istream_iterator<string>(in), istream_iterator<string>()); 

被解析爲函數聲明:

vector<string> v(istream_iterator<string> in, istream_iterator<string>); 

這通常被稱爲"C++' most-vexing parse"

我認爲一些額外的括號會治好的:

vector<string> v((istream_iterator<string>(in)), (istream_iterator<string>())); 
+0

謝謝很多sbi,問題解決了^^! 「最令人頭疼的解析」,我會記住這個名字! – Chan 2010-12-22 17:30:14

1

這就是所謂的most vexing parse一個例子。它是一個困擾許多C++程序員的問題。

基本上,此代碼並不意味着你認爲它的意思是:

vector<string> v(istream_iterator<string>(in), istream_iterator<string>()); 

聲明vector<string>類型的變量,而不是,你實際上是宣告功能命名v返回vector<string>

爲了解決這個問題,使用operator=這樣的:

vector<string> v = vector<string>(istream_iterator<string>(in), istream_iterator<string>()); 
+0

謝謝John,我真的很喜歡你的解決方案;) – Chan 2010-12-22 18:03:32

0

解析器認爲,以下行聲明一個函數:

vector<string> v(istream_iterator<string>(in), istream_iterator<string>()); 

更改主到這一點,它會編譯:

int main() 
{ 
    string s("Well well on"); 
    istringstream in(s); 
    istream_iterator<string> start = istream_iterator<string>(in); 
    vector<string> v(start, istream_iterator<string>()); 
    copy(v.begin(), v.end(), ostream_iterator<string>(cout, "\n")); 
}