3

我正在尝试使用此线程中找到的方法拆分字符串,但我正在尝试将其调整为 wstring。但是,我偶然发现了一个奇怪的错误。检查代码:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

int main(void)
{
    wstring str(L"Börk börk");
    wistringstream iss(str);
    vector<wstring> tokens;
    copy(istream_iterator<wstring>(iss), // I GET THE ERROR HERE
         istream_iterator<wstring>(),
         back_inserter< vector<wstring> >(tokens));

    return 0;
}

确切的错误信息是:

error: no matching function for call to 'std::istream_iterator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, char, std::char_traits<char>, int>::istream_iterator(std::wistringstream&)'

我认为它不能使用传递的实例化 istream_iterator iss(这是w istringstream 而不是 istringstream)。这是在使用 XCode 和 GCC 4.2 的 Mac 上。而且 AFAIK 没有 wistring_iterator 或类似的东西。

当我使用非 wstring 版本时,它可以完美运行。如您所见,我已将声明更改为 use wstringwistringstreams 和vector<wstring>,只是替换了所有内容以使用宽版本。

什么可能导致这种情况,为什么它不接受 wstring 版本?

4

1 回答 1

6

根据错误消息的后半部分,您必须覆盖 istream_iterator() 上的默认参数 2 和 3 以匹配其他地方的宽字符使用。在 Visual C++ 中,这个版本对我来说可以编译:

copy(istream_iterator<wstring, wchar_t, std::char_traits<wchar_t> >(iss), // I DO NOT GET THE ERROR HERE
    istream_iterator<wstring, wchar_t, std::char_traits<wchar_t> >(),
    back_inserter< vector<wstring> >(tokens));
于 2010-09-20T17:23:53.607 回答