簡體   English   中英

使用istream_iterator范圍進行構造時無法訪問向量

[英]Cannot access vector when constructing with istream_iterator range


我嘗試編譯此代碼段,但出現編譯器錯誤:(!使用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

發生了什么? 向量構造正確,我怎么不能調用它呢?

最好的祝福,

我認為這

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

被解析為函數聲明:

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

通常將其稱為“ C ++最令人煩惱的解析”

我認為可以在括號中加上一些括號來解決此問題:

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

這是所謂的最煩人的解析的一個例子。 這是一個困擾許多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>() );

解析器認為以下行在聲明一個函數:

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"));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM