我尝试在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);
错误C4146:一元减运算符应用于无符号类型,结果 仍未签名
具体来说,它位于darts.h,第189行。
我在Visual Studio 2015中再次构建,然后没有错误。
如何在Visual Studio 2013中解决此问题?
答案 0 :(得分:3)
C4146不应该是错误。这只是一个警告。如果您在案例中将其视为错误,则表示有人以这种方式配置,很可能是无意中。这毫无意义。
查找并撤消将其变为错误的更改。然后你可以根据需要禁用它。
答案 1 :(得分:2)
siblings
变量也应用了一元减号,也许这就是罪魁祸首?此外,如果它是模板化代码,你无法确定value_将是short,int还是long,除非通过static_assert左右声明。我们只能猜测,因为您没有提供有关实际使用的类型或可重复的内容的信息。您是否也在VS2015中使用完全相同的项目进行编译?如果没有,警告可能就在那里被禁用了。
无论如何,假设它是VS2013中的一个错误,它可能不会再被修复,因此您可以尝试找到解决方法。首先将该语句分解为较小的语句,直到您确切地知道哪个部分是问题(或者可能,到那时问题已经消失,因为它与编译器错误一致)。然后使用#pragma warning ( disable : 4146 )
来抑制警告,包含在条件指令中,这样它只对VS2013有效#if _MSC_VER > 1800 && _MSC_VER < 1900
应该没问题。在语句后再次启用警告。添加注释以禁用警告,并将更改作为补丁提交给CRF ++。
答案 2 :(得分:2)
试试这个:
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);
答案 3 :(得分:2)
对于其他人,我想添加另一个答案,以防他们偶然发现像我这样的错误。
即使&#34;威胁警告为错误&#34;在我的编译器中关闭了,我不得不在我的标题文件中用#pragma warning(disable:4146)
编译我的项目,该文件向我显示错误。对你来说,它本来就在 darts.h
请注意,在我的项目中全局禁用警告不起作用(编译器/wd4146
),标题文件中直接需要pragma行。