2010-09-20 4 views
3

Я пытаюсь разбить строку, используя метод, найденный в this thread, но я пытаюсь адаптировать его к wstring. Однако я наткнулся на странную ошибку. Проверьте код:Не удается создать экземпляр istring_iterator с помощью wistringstream

#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 (которое является ж istringstream вместо oftringstream). Это на Mac с использованием XCode и GCC 4.2. А AFAIK нет ни одного wistring_iterator или что-то в этом роде.

Он отлично работает, когда я использую версию, отличную от wstring. Как вы могли бы заметить, я изменил декларации на использование wstring, wistringstream и vector<wstring>, просто заменив все, чтобы использовать широкую версию.

Что может быть причиной этого и почему он не примет версию wstring?

ответ

5

Для последней части сообщения об ошибке вы должны переопределить параметры 2 и 3 по умолчанию на istream_iterator(), чтобы соответствовать широкополосному использованию в другом месте. В Visual C++ эта версия компилирует OK для меня:

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));