2010-09-20 43 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));