使用getter函数传递引用参数时出现意外行为

时间:2014-09-05 12:11:08

标签: c++ sfml

我使用sfml getter函数传递引用参数,如:

ball.update(time,pad_player.getGlobalBounds(),pad_ia.getGlobalBounds(),score);

但出现了这个问题:

Pong.cpp: In member function ‘void Pong::run()’:
Pong.cpp:30:82: error: no matching function for call to ‘Ball::update(sf::Time&, sf::FloatRect, sf::FloatRect, Score&)’
   ball.update(time, pad_player.getGlobalBounds(), pad_ia.getGlobalBounds(), score);
                                                                                  ^
Pong.cpp:30:82: note: candidate is:
In file included from Pong.hpp:5:0,
                 from Pong.cpp:2:
Ball.hpp:10:7: note: void Ball::update(sf::Time&, sf::FloatRect&, sf::FloatRect&, Score&)
  void update(sf::Time& delta, sf::FloatRect& p1, sf::FloatRect& p2, Score& score);
       ^
Ball.hpp:10:7: note:   no known conversion for argument 2 from ‘sf::FloatRect {aka sf::Rect<float>}’ to ‘sf::FloatRect& {aka sf::Rect<float>&}

所以,如果我改变了这个:

    sf::FloatRect player = pad_player.getGlobalBounds();
    sf::FloatRect ia = pad_ia.getGlobalBounds();
    ball.update(time, player, ia, score);

程序运行正常。

为什么?

2 个答案:

答案 0 :(得分:1)

错误消息显示Ball::update期望参数2和3的非对象FloatRect引用。临时返回值不能绑定到标准兼容编译器中的nonconst引用,因此错误非常正确。 / p>

如果您可以选择将Ball::update更改为const FloatRect&,则应该可以执行您尝试的操作。

答案 1 :(得分:0)

您的电话:

ball.update(time, 
            pad_player.getGlobalBounds(), 
            pad_ia.getGlobalBounds(), 
            score);

被解释为

Ball::update(sf::Time&, sf::FloatRect, sf::FloatRect, Score&)

与您的声明存在差异:

void Ball::update(sf::Time&, sf::FloatRect&, sf::FloatRect&, Score&)
                                          ^               ^
//                                   expecting references here

实际上,你的第二个和第三个参数是函数的返回值,它只能绑定到左值参数,const rvalue参数参数到右值参考参数(标记为&&)。

在这种情况下,最简单的修复方法是更改​​为const引用而不仅仅是引用,这样它就可以用于临时AND和变量。

void Ball::update(sf::Time&, const sf::FloatRect&, const sf::FloatRect&, Score&);