使用 P-RNG 时需要缩小转换

Narrowing conversion required while using a P-RNG

我正在尝试获取介于最小值和最大值之间的随机数,但出现缩小转换错误。我检查了 uniform_int_distribution 的模板参数,所以使用 short 应该不是问题。

Template parameters
IntType - The result type generated by the generator. The effect is undefined if this is not one of short, int, long, long long, unsigned short, unsigned int, unsigned long, or unsigned long long.

在我试图解决这个问题时,我将这些值转换为一个 short 似乎并没有解决它。 当 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

根据我的理解,编译器将值视为整数并尝试转换它们。

1 是一个 int,因为数字文字是 int,除非另有说明。

由于 C 的历史原因,

maxPosX-1maxPosY-1 也是 int。小于 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 );