5

为什么 C++ 中没有 std::wostream_iterator?

这有什么好的理由吗?

#include <fstream>
#include <iterator>
#include <string>
#include <vector>

int main()
{
    std::vector<std::wstring> myvec = { L"first", L"second" };

    std::wofstream f("New.txt");
//  std::copy(myvec.begin(), myvec.end(), std::wostream_iterator<std::wstring>(f)); // Error
//  std::copy(myvec.begin(), myvec.end(), std::ostream_iterator<std::wstring>(f)); // Error
    std::copy(myvec.begin(), myvec.end(), std::ostream_iterator<std::wstring, wchar_t>(f)); // Ok
    std::copy(myvec.begin(), myvec.end(), std::ostream_iterator<std::wstring, wchar_t, std::char_traits<wchar_t>>(f)); // Ok
}
4

1 回答 1

4

因为std::ostream_iteratoris 不是typedef(并且std::wstring是 typedef on std::basic_stringwith charT= wchar_t)。

template <class T, class charT = char, class traits = char_traits<charT> >
class ostream_iterator:
public iterator<output_iterator_tag, void, void, void, void>

第二次复制操作

std::copy(myvec.begin(), myvec.end(), std::ostream_iterator<std::wstring>(f));

是不正确的,因为

typedef basic_ostream<charT,traits> ostream_type;

所以,在这种情况下ostream_typebasic_ostream<char, std::char_traits<char> >

ostream_iterator(ostream_type& s);

构造函数只能接收这种类型,但是我们通过basic_ofstream<wchar_t, std::char_traits<wchar_t> >,是不正确的。

于 2012-08-26T13:15:10.993 回答