2010-09-20 28 views
3

我想使用在this thread中找到的方法分割字符串,但我试图将其调整为wstring。但是,我偶然发现了一个奇怪的错误。检查代码:无法使用wistringstream实例化istring_iterator

#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)。这是在Mac上使用XCode和GCC 4.2。 AFAIK没有wistring_iterator或类似的东西。

当我使用非wstring版本时,它完美的工作。您可能会看到我已更改声明以使用wstringwistringstream s和vector<wstring>,只是将所有内容全部替换为使用宽版本。

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

回答

5

根据错误消息的后半部分,您必须覆盖istream_iterator()上的默认参数2和3以与其他地方的widechar用法相匹配。在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));