2010-12-22 83 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")); 
}