C++ 错误C4146:一元减号运算符应用于无符号类型,结果仍然无符号

C++ 错误C4146:一元减号运算符应用于无符号类型,结果仍然无符号,c++,visual-studio,casting,C++,Visual Studio,Casting,我尝试在Visual Studio 2013中构建CRF++并在最后一行中得到此错误: array_[begin + siblings[i].code].base = value_ ? static_cast<array_type_>(-value_[siblings[i].left]-1) : static_cast<array_type_>(-siblings[i].left-1); 数组\[b

我尝试在Visual Studio 2013中构建CRF++并在最后一行中得到此错误:

array_[begin + siblings[i].code].base =
            value_ ?
            static_cast<array_type_>(-value_[siblings[i].left]-1) :
            static_cast<array_type_>(-siblings[i].left-1);
数组\[begin+同级[i].code].base=
价值观?
静态_转换(-value_u[i].左]-1):
静态_-cast(-兄弟[i].左-1);
错误C4146:一元减号运算符应用于无符号类型,结果 仍然没有签名

特别是在省道中。h,第189行

我在VisualStudio2015中再次构建,然后没有错误


如何在Visual Studio 2013中修复此问题?

C4146不应是错误。这只是一个警告。如果您将其视为案例中的错误,则表示有人以这种方式配置了它,很可能是无意中配置的。这毫无意义


查找并撤消将其变成错误的更改。如果您愿意,您可以禁用它。

同级
变量也应用了一元负号,也许这就是罪魁祸首?此外,如果它是模板化代码,您无法真正确定value_uu将是短的、int的或长的,除非通过static_u断言或其他方式断言。我们只能猜测,因为您没有提供关于实际使用的类型或可复制类型的信息。您是否在VS2015中使用了完全相同的项目进行编译?如果没有,警告可能只是在那里被禁用了

无论如何,假设它是VS2013中的一个bug,它可能永远不会被修复,所以您可以尝试找到解决方法。首先,将该语句分解为更小的语句,直到您确切地知道问题出在哪一部分(或者,到那时,问题已经随着编译器错误而消失)。然后,使用条件指令包装的
#pragma warning(disable:4146)
抑制警告,这样它只对VS2013
有效,如果1800和1900
可以正常工作。在语句之后再次启用警告。添加关于为什么禁用警告的注释,并将更改作为补丁提交给CRF++。

尝试以下操作:

int tmp = static_cast<int>(siblings[i].left);

array_[begin + siblings[i].code].base =
            value_ ?
            static_cast<array_type_>(-value_[siblings[i].left]-1) :
            static_cast<array_type_>(-tmp - 1);
inttmp=static_cast(兄弟[i].左);
数组\[begin+同级[i]。代码].base=
价值观?
静态_转换(-value_u[i].左]-1):
静态_-cast(-tmp-1);

对于其他人,我想添加另一个答案,以防他们像我一样偶然发现这个错误

即使在我的编译器中关闭了“Threat warning as error”(威胁警告为错误),我也必须在显示错误的头文件中使用
#pragma warning(disable:4146)
来编译我的项目。对你来说,它应该在飞镖里


请注意,在我的项目中全局禁用警告不起作用(编译器
/wd4146
),需要在头文件中直接使用pragma行。

值的类型是什么?@HappyCoder:array\u type\u*value\u;而
数组类型
的定义是:如果某个东西已经是
数组类型
一旦通过
值[…]
解除引用,那么为什么
静态类型
数组类型*
?@HappyCoder:这是一个模板类型,可以是短的,也可以是长的。谢谢,AnT。我从错误列表窗口获取此信息。默认情况下,我安装了Visual Studio 2013,并且没有更改项目的设置和属性中的任何内容。我读了几篇关于“将警告视为错误”的帖子,但没有成功。似乎这个问题的一个版本是在VisualStudio中。据推测,它已在(即将发布的,截至本文撰写之时)版本16.4预览版1中修复。