当我在visual studio中编写这样的代码时:
void aaa()
{
std::string a = " ";
std::string b = "";
b += 1.0f + a;
}
为什么会收到这样的错误? std::reverse_iterator
来自哪里?
错误C2784:' std :: reverse_iterator< _RanIt> std :: operator +(reverse_iterator< _RanIt> :: difference_type,const std :: reverse_iterator< _RanIt>&)':无法推断出' const std :: reverse_iterator< _RanIt>的模板参数。 &安培;'来自' std :: string'
答案 0 :(得分:0)
确实,这是来自Microsoft编译器的预期错误消息。
它发生的原因是因为你包含<string>
标题,它为不同的迭代器定义了几个operator+
模板:
// reverse_iterator TEMPLATE OPERATORS
template<class _RanIt> inline
reverse_iterator<_RanIt> operator+(
typename reverse_iterator<_RanIt>::difference_type _Off,
const reverse_iterator<_RanIt>& _Right)
{ // return reverse_iterator + integer
return (_Right + _Off);
}
由于没有operator+
存在添加浮点数,std::string
您的代码将无法编译。但是在编译期间,编译器检测到上面提到的std::operator+
可能是候选者,因为你的浮点数可以转换为reverse_iterator<_RanIt>::difference_type
。在尝试使用此operator+
时,它无法推断出应该使用哪种类型来代替_RanIt
将std::string
转换为const reverse_iterator<_RanIt>&
。
如您所述,编译器然后尝试将其他版本的operator+
与其他迭代器类型匹配:
错误C2784:'std :: _ Array_const_iterator&lt; _Ty,_Size&gt;的std ::操作 +(_ Array_const_iterator&LT; _Ty,_size&GT; :: difference_type,性病:: _ Array_const_iterator&LT; _Ty,_size&GT)': 无法推断出模板参数 '的std :: _ Array_const_iterator&LT; _Ty,_size&GT;'来自'std :: string'
错误C2784:'std :: _ Array_iterator&lt; _Ty,_Size&gt;的std ::操作 +(_ Array_iterator&LT; _Ty,_size&GT; :: difference_type,性病:: _ Array_iterator&LT; _Ty,_size&GT)': 无法推断出模板参数 '的std :: _ Array_iterator&LT; _Ty,_size&GT;'来自'std :: string'......
作为旁注,在C ++中,您应首先将数字转换为字符串,然后连接(例如添加)它们。这应该适合你:
b += std::to_string(1.0f) + a;