Why istream_iterator <string> (ifstream ("test.txt")) causes an error?

I tried to write code to read lines from a file named "test.txt" and write lines for standard output. The code below works well:

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

However, with this modification, the code no longer compiles:

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

Why is this version not compiling?

I used the g ++ 4.6.2 compiler and the error as shown below:

 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 
+4
source share
1 answer

There are (I believe) two errors here:

(1) You need to put quotes around test.txt :

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

(2) istream_iterator takes the value istream& (that is, an lvalue reference to the stream). Therefore, the thread you are passing must be an lvalue. However, the transfer of ifstream("test.txt") takes place in a temporary object of type ifstream , which is the value of r, not lvalue. This is for the same reason that you cannot do this:

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

Hope this helps!

+8
source

Source: https://habr.com/ru/post/1487586/


All Articles