【问题标题】:error C2664 converting from from const std::string to std::string&从 const std::string 转换为 std::string& 时出现错误 C2664
【发布时间】:2024-07-17 01:30:02
【问题描述】:

我在 Visual Studio 中不断收到 C2664 转换错误

它告诉我它不能将参数 1 从 const std::string 转换为 std::string&。我尝试在 stringToWstring 原型和函数本身中添加/删除 const,但仍然出现错误。

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

}

有什么想法吗?

编辑:

我知道这真的很令人困惑,所以我将解释更多..

最初,我想要的是 for 循环中的这些行

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

我还希望 *tok_iter 返回一个 wstring,但我收到如下错误:cannot convert parameter 1 from const std::string to 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

我希望现在更清楚了。

【问题讨论】:

  • 如果错误是关于 const string to string&,你为什么要问关于将 string 转换为 wstring 的问题?
  • 带有双星号的部分,如果它不在代码块中,则会加粗。
  • @jalf 啊,我问了关于将字符串转换为 wstring 的问题,因为函数给出了错误,我应该更具体一些
  • hexval 是如何定义的?
  • 老实说,它仍然非常令人困惑。你可以编辑问题,特别是让代码看起来完全像你试图编译的那样,错误消息是_exactly _你得到什么?

标签: c++ visual-c++


【解决方案1】:

查看编辑后的问题,您的错误在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&lt;_Elem,_Traits,_Alloc&gt; 和第二个 const std::_String_const_iterator&lt;_Elem,_Traits,_Alloc&gt; &amp;(VC++ 确实不擅长格式化这些信息,但它就在那里)

很可能,其中一个有char 对应_Elem,另一个有wchar_t

【讨论】:

    【解决方案2】:

    我认为标记器迭代器实际上返回的是 wstring,而不是字符串。您期望 stringToWstring 函数中有一个字符串(引用)。

    或者您应该将标记器的模板类型从 wchar_t 更改为 char。如果没有代码上下文,我无法准确判断...

    【讨论】: