【问题标题】:Operator '*' is ambiguous (C++)运算符 '*' 不明确 (C++)
【发布时间】:2018-06-09 10:43:20
【问题描述】:

最近我一直在用 C++ 制作一个测试“游戏”(以适应 SFML)。我制作了一个超级马里奥精灵,如下图所示

sf::Texture SuperMarioAnim;
if (!SuperMarioAnim.loadFromFile("img/image.png"))
{
    std::wcout << L"Συγγνώμη, η εικόνα SuperMarioAnim δεν υπάρχει ή διαγράφηκε";
}

sf::Sprite SuperMario;
SuperMario.setTexture(SuperMarioAnim);
SuperMario.setPosition(200, 2900);

我还创建了一个 player_speed 整数,显然是玩家的速度值,我还创建了一个时间对象,该对象等于我们从clock.getElapsedTime() 获得的值:

int player_spd = 30;

while (window.isOpen())
{
    //...
    sf::Time time;
    time = clock.getElapsedTime();
    //...
}

但是,当我告诉精灵在 X 轴上移动时:

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    SuperMario.move(sf::Vector2f((player_spd * time), 0));

我收到此错误:1&gt;c:\[directory]\visual studio 2017\projects\test_game\test_game\test_game.cpp(180): error C2593: 'operator *' is ambiguous(第 180 行是上面的 SuperMario.move 命令)

谁能说明我做错了什么?我正在使用 Visual Studio 2017 和 SFML 2.4

【问题讨论】:

  • 它们不是可以一起成为* 的类型。你不能做std::string * int -> 在这里做同样的事情。你可以创建一个处理这两种参数类型的函数来做*
  • @PYA 但是clock.getElapsedTime() 不返回数值吗?因为player_spd肯定是一个数值(所以我们不用担心这个变量)
  • 如果 operator* 重载,您应该能够将 sf::Time 和 int 相乘。看起来是这样的:sfml-dev.org/documentation/2.0/classsf_1_1Time.php 尝试像这样将 player_spd 转换为浮点数:sf::Vector2f(((float)player_spd * time), 0)

标签: c++ sfml


【解决方案1】:

sf::Time 定义了operator*的这些重载1

Time    operator* (Time left, float right)
    //Overload of binary * operator to scale a time value. 

Time    operator* (Time left, Int64 right)
    //Overload of binary * operator to scale a time value. 

Time    operator* (float left, Time right)
    //Overload of binary * operator to scale a time value. 

Time    operator* (Int64 left, Time right)
    //Overload of binary * operator to scale a time value. 

该错误表示重载解析失败,因为它无法在其中进行选择。 player_spdint。调用operator* 需要将其转换为floatInt64。两者都不比另一个更好(根据错误消息)。所以它是模棱两可的。

您可以强制转换,或者将player_spd 定义为sf::Time 可以乘以的类型之一。

【讨论】:

  • 所以我需要把它变成一个浮点数,这就是你的意思,不是吗?
  • @ToadTheMushroomCoder - 或Int64。其实挺奇怪的。我希望Int64 是一个大于int 的整数类型。所以这将是一种提升,实际上排名比转换为float 更好。但似乎并非如此。
  • 只需投射它:((float)player_spd)。或 (Int64)player_spd
  • @ToadTheMushroomCoder -- 或者从一开始就使用正确的类型,Int64 而不是int
  • @ToadTheMushroomCoder 不要乘以时间,乘以秒例如:float t = time.asSeconds();
【解决方案2】:

'clock.getElapsedTime()' 返回一个 'Time' 对象。您可以选择从“时间”对象返回浮点数作为“asSeconds()”、“asMilliseconds()”或“asMicroseconds()”。我相信这将解决您的错误,但我无法测试。我还建议将“player_spd”更改为浮点数。

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    SuperMario.move(player_spd * time.asSeconds()), 0));

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多