4

「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
4

1 に答える 1

8

ここには(私が信じている)2つのエラーがあります:

(1) 前後に引用符を付ける必要がありますtest.txt:

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

(2)istream_iteratorのコンストラクターはistream&(つまり、ストリームへの左辺値参照) を取ります。したがって、渡すストリームは左辺値でなければなりません。ただし、渡すとifstream("test.txt")、 type の一時オブジェクトが渡されます。ifstreamこれは、 lvalueではなくrvalueです。これができないのと同じ理由です:

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

お役に立てれば!

于 2013-06-22T02:24:21.630 に答える