2013-06-22 52 views
4

我試圖編寫一個代碼來從名爲「test.txt」的文件中讀取字符串並將字符串寫入標準輸出。下面的代碼工作得很好:爲什麼istream_iterator <string>(ifstream(「test.txt」))會導致錯誤?

int main() 
{ 
    using namespace std; 
    ifstream file("test.txt"); 
    copy(istream_iterator<string>(file), 
      istream_iterator<string>(), 
      ostream_iterator<string>(cout, " ")); 
} 

然而,這種修改,代碼不再編譯:

int main() 
    { 
     using namespace std; 
     copy(istream_iterator<string>(ifstream("test.txt")), // <-- Error here 
     istream_iterator<string>(), 
     ostream_iterator<string>(cout, " ")); 
    } 

爲什麼沒有這個版本的編譯?

我使用的編譯器是G ++ 4.6.2,錯誤如下:

ex11-16.cpp:16:65: error: no matching function for call to 'std::istream_iterator<std::basic_string<char> >::istream_iterator(std::ifstream)' 
ex11-16.cpp:16:65: note: candidates are: 
.../bits/stream_iterator.h:72:7: note: std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(const std::istream_iterator<_Tp, _CharT, _Traits, _Dist>&) [with _Tp = std::basic_string<char>, _CharT = char, _Traits = std::char_traits<char>, _Dist = int, std::istream_iterator<_Tp, _CharT, _Traits, _Dist> = std::istream_iterator<std::basic_string<char> >] 
.../bits/stream_iterator.h:72:7: note: no known conversion for argument 1 from 'std::ifstream {aka std::basic_ifstream<char>}' to 'const std::istream_iterator<std::basic_string<char> >&' 
.../bits/stream_iterator.h:68:7: note: std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator(std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type&) [with _Tp = std::basic_string<char>, _CharT = char, _Traits = std::char_traits<char>, _Dist = int, std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_type = std::basic_istream<char>] 
.../bits/stream_iterator.h:68:7: note: no known conversion for argument 1 from 'std::ifstream {aka std::basic_ifstream<char>}' to 'std::istream_iterator<std::basic_string<char> >::istream_type& {aka std::basic_istream<char>&}' 
.../bits/stream_iterator.h:64:26: note: std::istream_iterator<_Tp, _CharT, _Traits, _Dist>::istream_iterator() [with _Tp = std::basic_string<char>, _CharT = char, _Traits = std::char_traits<char>, _Dist = int] 
.../bits/stream_iterator.h:64:26: note: candidate expects 0 arguments, 1 provided 
+1

*甚至不能編譯* - 至少應該給我們提供錯誤。 – chris

+2

在第二個例子中'ifstream(test.txt)'應該是'ifstream(「test.txt)''或者你應該編輯你的問題以包含正確的代碼。 –

回答

8

有(我相信)兩個錯誤的位置:

(1)你需要把圍繞test.txt語錄:

istream_iterator<string>(ifstream("test.txt"), ...); 

(2)istream_iterator的構造需要在istream&(即,一個左值參照流)。因此,您傳入的流必須是左值。但是,傳入ifstream("test.txt")傳入ifstream類型的臨時對象,該對象是右值而不是左值。這是你不能這樣做的原因:

int function(int& x) { 
    x++; 
} 
int main() { 
    function(137); // Error - 137 is an rvalue, but lvalue is needed. 
} 

希望這有助於!

相關問題