2014-06-07 4 views
6

내가 cout 통해 범위 생성자 다음 출력을 사용하여 vector<string에 텍스트 파일의 모든 라인을로드 할 :벡터 범위 생성자를 올바르게 사용하는 방법은 무엇입니까?

#include<iostream> 
#include<fstream> 
#include<vector> 
#include<iterator> 

using namespace std; 

int main() 
{ 
    ifstream file("file.txt"); 
    vector<string> strings(istream_iterator<string>(file) , istream_iterator<string>()); 

    for(auto s : strings) 
    cout << s << endl; 

    return 0; 
} 

예를 들어, 나는 몇 가지 오류를 얻을 수 위의 코드를 컴파일하려고 :

error: no matching function for call to ‘begin(std::vector<std::basic_string<char> > (&) (std::istream_iterator<std::basic_string<char> >, std::istream_iterator<std::basic_string<char> > (*) ()))’ 
    for(auto s : strings) 
       ^

여러 다른 ...

나는 사람이 도움을 주시기 바랍니다 수 있습니다, 내가 여기에 분명 뭔가 빠진 것 같아요?

+3

[Most Vexing Parse] (http://en.wikipedia.org/wiki/Most_vexing_parse)를 참조하십시오. – chris

+3

도움이 될 수도 있습니다 : http://stackoverflow.com/questions/7007817/a-confusing-detail-about-most-vexing-parse – templatetypedef

+0

알겠습니다. 이 질문을 삭제하거나 직접 답변해야합니까? – JLagana

답변

6

당신은 두 개의 인수 복용, 컴파일러가 vector<string>를 반환하는 함수 strings로 선언을보고 가장 성가신 구문 분석, 피해자를 떨어 :

  • istream_iterator<string>라는 file
  • 함수에 이름이 포인터 인수를 취하지 않고 istream_iterator<string>을 반환합니다.

는 골치 아픈 구문 분석을 제거 첫 번째 인수 괄호의 추가 쌍을 사용하려면

vector<string> strings((istream_iterator<string>(file)) , istream_iterator<string>()); 
//     ^       ^

또는 대안 C++ 11에서 strings 생성자

vector<string> strings{istream_iterator<string>(file) , istream_iterator<string>()}; 
//     ^              ^
위해 중괄호를 사용

참고 : Clang은 -Wvexing-parse (기본 설정)을 통해 경고합니다.