ошибка C2664 при преобразовании из const std :: string в std :: string & - PullRequest
0 голосов
/ 20 августа 2009

Я получаю ошибку преобразования C2664 в visual studio

Он говорит мне, что не может преобразовать параметр 1 из const std :: string в std :: string &. Я попытался добавить / удалить const в прототипе 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:

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

Изначально я хотел, чтобы эти строки были внутри цикла for

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

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

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

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

Надеюсь, теперь стало понятнее.

Ответы [ 2 ]

2 голосов
/ 20 августа 2009

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

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

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.

1 голос
/ 20 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...