如何修复隐式转换的C ++警告?

时间:2019-01-30 14:32:56

标签: c++ qt-creator implicit-conversion

我刚刚开始使用C ++。

我正在尝试获取字符串'str'的前三个字符,并将其与已知字符串(例如'knownString')进行比较。

为此,我编写了以下代码行:

  

if(str.substr(start,3)== knownString)

其中'start'是我之前声明的整数。 但是我一直收到以下警告消息:

  

警告:隐式转换将签名:“ int”更改为   'std :: __ cxx11 :: basic_string,**   ** std :: allocator> :: size_type'(又名“ unsigned int”)

有人知道我可以添加什么,或者我在此声明中错过了解决此问题的方法吗?

2 个答案:

答案 0 :(得分:4)

This warning is triggered by the -Wsign-conversion switch,检测到您正在使用带符号变量并将其转换为无符号变量,其方式可能会更改该值。

对于肯定的字面值而言,它不是这样做的,因为转换显然不会改变值,因为那将是毫无意义的,而且确实很烦人。您将获得像-5这样的否定文字。

(从技术上讲,这是应用了一元求反运算符的文字5,而不是“负文字”!)。

对于命名变量,它无法真正预测出该值是什么,因此谨慎行事。

您应该使变量start的类型为size_t

答案 1 :(得分:4)

您可以:

要么1.明确显示转换:

{
    "CountryRecord":
{
        "Country_Name": "AP"
},
"UserRecord":
{

        "Name": "Test User",
        "userName": "Test.User@mail.com",
        "userRole": "Hr"
  }
}

或者2.首先不要进行转化:

str.substr(static_cast<std::string::size_type>(start), 3)

或3.要求编译器不要警告它:

std::string::size_type start;

我建议选择2。