2009-08-20 21 views
0

Я продолжаю получать ошибки преобразования C2664 в визуальной студииошибка C2664 преобразования из из сопзЬ станд :: строки в StD :: строка &

Он говорит мне, что он не может преобразовать параметр 1 из сопзЬ станд :: строку std :: string &. Я попытался добавить/удалить константу в прототипе stringToWstring и самой функции, и ошибка все еще возникает.

wstring hexval = buff.substr(buff.find(L"hex(2):")); 
    wstring h; 
    wchar_t ch; 

    typedef boost::tokenizer<boost::char_separator<wchar_t> > tokenizer; 
    boost::char_separator<wchar_t> sep(L"//,"); 

    tokenizer tokens(hexval, sep); 

    for(tokenizer::iterator tok_iter = tokens.begin(); tok_iter != tokens.end(); tok_iter++) 
    { 
     ch = someFunction(*tok_iter); //error here 
     h += ch; 
    } 



wstring stringToWstring(const string& s) 
{ 
    wstring temp(s.length(), L''); 
    copy(s.begin(), s.end(), temp.begin()); 
    return temp; 
} 

    wchar_t someFunction(const wstring &hex_val) 
{ 

} 

Любые идеи?

EDIT:

Я вижу, что это действительно заблуждение, так что я собираюсь объяснить немного больше ..

Первоначально я хотел эти строки внутри для цикла

ch = someFunction(*tok_iter); 
h += ch 

Я также ожидал, что * tok_iter вернет wstring, но у меня возникла ошибка: не может преобразовать параметр 1 из const std :: string в const std :: wstring &

Из-за этого я предположил, что каким-то образом * tok_iter является const std :: string, поэтому я создал функцию stringToWstring для преобразования. Для того, чтобы сделать это в течение цикла

ch = someFunction(stringToWstring(*tok_iter)); 
h += ch 

Когда я сделал это, я получил:

Error 1 error C2664: 'std::_String_const_iterator<_Elem,_Traits,_Alloc>::_String_const_iterator(const std::_String_const_iterator<_Elem,_Traits,_Alloc> &)' : cannot convert parameter 1 from 'std::_String_const_iterator<_Elem,_Traits,_Alloc>' to 'const std::_String_const_iterator<_Elem,_Traits,_Alloc> &' c:\program files\boost\boost_1_39\boost\tokenizer.hpp 63 

Я надеюсь, что это яснее.

+0

какая «полужирная деталь»? –

+0

Почему вы спрашиваете о преобразовании строки в wstring, если ошибка говорит о const string для string &? – jalf

+0

Часть с двойными звездочками вокруг нее, которая была бы выделена жирным шрифтом, если бы она не была в блоке кода. – chaos

ответ

2

Рассматривая отредактированный вопрос, ваша ошибка находится внутри boost/tokenizer.hpp, но не по указанной строке.

Так что я предполагаю, что ваш токенизатор ошибочен. Глядя на http://www.boost.org/doc/libs/1_34_0/libs/tokenizer/tokenizer.htm, он принимает три аргумента шаблона, а третий по умолчанию - std::string. Так как вы хотите использовать его на std::wstring, я бы сказал, что вы должны создать свой Tokenizer, как это вместо:

tokenizer<boost::char_separator<wchar_t>, std::wstring::const_iterator, std::wstring> 

В общем при отладке ошибок в типах шаблонов, обязательно загляните в области вывода, на после ошибки. Visual Studio покажет вам тип, используемые в шаблонах там, что позволяет различать в сообщении об ошибке первого std::_String_const_iterator<_Elem,_Traits,_Alloc> из второго const std::_String_const_iterator<_Elem,_Traits,_Alloc> & (VC++ действительно не очень хорошо форматирования этой информации, но она есть)

Наиболее вероятно, один из них имеет char для _Elem, а другой имеет wchar_t.

+0

эй, я редактировал вопрос, надеюсь, что теперь яснее –

+0

спасибо, что сработало :) –

1

Я думаю, что итератор токенизации фактически возвращает wstring, а не строку. Вы ожидаете строку (ссылку) в функции stringToWstring.

Или вы должны изменить тип шаблона для токенизатора от wchar_t до char. Я не могу точно сказать, без контекста кода ...

Смежные вопросы