【问题标题】:Narrowing conversion required while using a P-RNG使用 P-RNG 时需要缩小转换范围
【发布时间】:2021-07-08 14:12:25
【问题描述】:

我试图在最小值和最大值之间获得一个随机数,但我得到一个缩小的转换错误。我已经检查了 uniform_int_distribution 的模板参数,所以使用 short 应该不是问题。

模板参数
IntType - 生成器生成的结果类型。如果这不是 shortintlonglong long 之一,则效果未定义unsigned shortunsigned intunsigned longunsigned long long

在我试图解决这个问题时,我将这些值转换为一个似乎无法解决问题的短值。 当 2 个整数值被赋予 randX 和 randY 时,错误消失了。

还原对它所做的更改后我当前的代码:

Fruit Fruit::getRandomFruit(const short& maxPosX, const short& maxPosY)
{
    bool isEaten{0};
    std::uniform_int_distribution<short> randX{ 1, maxPosX-1 };
    std::uniform_int_distribution<short> randY{ 1, maxPosY-1 };

    COORD frPos{randX(mersenne), randY(mersenne)};

    return {isEaten,
            frPos
    };
}

错误信息:

Element '2': conversion from 'int' to '_Ty' requires a narrowing conversion

据我了解,编译器将这些值视为整数并尝试对其进行转换。

【问题讨论】:

标签: c++ random compiler-errors c++17 console-application


【解决方案1】:

1 是一个int,除非另有说明,否则数字文字是int

maxPosX-1maxPosY-1 也是 ints,出于历史 C 的原因。小于int 的整数类型的运算符会产生int 结果。

解决方案 1:将它们缩短。

std::uniform_int_distribution<short> randX{ short(1), short(maxPosX-1) };
std::uniform_int_distribution<short> randY{ short(1), short(maxPosY-1) };

解决方案 2:使用 ( ) 而不是 { } 构建以消除缩小错误。

std::uniform_int_distribution<short> randX( 1, maxPosX-1 );
std::uniform_int_distribution<short> randY( 1, maxPosY-1 );

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多