gpt4 book ai didi

c++ - 如何删除由于正确的流分支而永远不会发生的负偏移警告?

转载 作者:行者123 更新时间:2023-11-30 02:42:48 25 4
gpt4 key购买 nike

我在使用模板编译一些代码时遇到了一些非常有趣的错误。

问题是编译器似乎无法比较数字。无论一个参数是更大还是更小,它都会发出警告。

我的最小示例如下所示:

template< int shift >
struct Shifter
{
int value;

template< int otherShift >
Shifter< shift > &operator >>=( Shifter< otherShift > &rhs )
{
if ( shift > otherShift )
{
this->value = rhs.value >> (shift - otherShift);
return *this;
}
else
{
this->value = rhs.value << (otherShift - shift );
return *this;
}
}
};

int main( void )
{
Shifter< 3U > a = { 5 };
Shifter< 2U > b = { 2 };

a >>= b;
b >>= a;

}

编译时我收到以下警告:

In instantiation of 'Shifter<shift>& Shifter<shift>::operator>>=(Shifter<otherShift>&) [with int otherShift = 2; int shift = 3 ]'
warning: left shift by negative number [enabled by default]
In instantiation of 'Shifter<shift>& Shifter<shift>::operator>>=(Shifter<otherShift>&) [with int otherShift = 3; int shift = 2 ]'
warning: right shift by negative number [enabled by default]

警告消息是从丹麦语翻译而来的,因此可能不是逐字的。

编译器是 Windows 上的 minGW gcc 4.7.2 以及来自 IAR 的 iccarm

我真的需要它在没有 boost 的情况下使用 c++03 工作,所以请不要使用 enable_if 或“只使用 boost-this-and-that”答案。

顺便说一句,我的单元测试工作正常,但我宁愿在编译我的代码时没有警告。

最佳答案

问题是,编译器不检查 if 子句,因此无法知道您是否执行负移位。

您可以使用绝对函数来避免这种情况:

#include <cstdlib>

// ...

template< int otherShift >
Shifter< shift > &operator >>=( Shifter< otherShift > &rhs )
{
if ( shift > otherShift )
{
this->value = rhs.value >> abs(shift - otherShift);
return *this;
}
else
{
this->value = rhs.value << abs(otherShift - shift );
return *this;
}

关于c++ - 如何删除由于正确的流分支而永远不会发生的负偏移警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26753640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com