Почему istream_iterator & lt; string & gt; (ifstream (& quot; test.txt & quot;)) вызывает ошибку?

Я попытался написать код для чтения строк из файла с именем «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) Вы должны поместить цитаты вокруг test.txt:

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

(2) istream_iteratorконструктор принимает в istream& (то есть ссылка lvalue на поток). Следовательно, поток, через который вы проходите, должен быть lvalue. Однако, проходя в ifstream("test.txt") переходит во временный объект типа ifstream, который является Rvalue а не именующий. Это та же самая причина, по которой вы не можете сделать это:

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

Надеюсь это поможет!

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]