2013-06-22 59 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. 
} 

希望这有助于!

相关问题