无法推断出' const std :: reverse_iterator< _RanIt>的模板参数。 &安培;'来自' std :: string'

时间:2017-05-17 23:09:38

标签: c++ string visual-studio

当我在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'

1 个答案:

答案 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+时,它无法推断出应该使用哪种类型来代替_RanItstd::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;