为什么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
}
答案 0 :(得分:3)
由于std::ostream_iterator
不是typedef
(而std::wstring
是std::basic_string
上的charT
= wchar_t
,因此{/ 1}}。
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_type
为basic_ostream<char, std::char_traits<char> >
ostream_iterator(ostream_type& s);
构造函数只能接收此类型,但我们传递basic_ofstream<wchar_t, std::char_traits<wchar_t> >
,这是不正确的。