我使用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);
程序运行正常。
为什么?
答案 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&);