我正在使用SFML作为学习练习制作Arkanoid克隆.对于PowerUp类,我有一个像这样的更新方法:
void PowerUp::update(FrameTime mFT) {
if (!(bottom() >= windowHeight))
shape.move(velocity * mFT);
else
onGround = true;
}
Run Code Online (Sandbox Code Playgroud)
在我的PowerUpManager类中,我有一个PowerUp向量,这个函数可以立即更新所有PowerUp:
void PowerUpManager::update(FrameTime mFT) {
for (auto powerUp : mPowerUps)
powerUp.update(mFT);
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用.如果我运行这个代码,那么在产生之后,通电就会保持不变,并且不要向下移动,就像它们应该的那样.但是,如果我更换
for (auto powerUp : mPowerUps)
powerUp.update(mFT);
Run Code Online (Sandbox Code Playgroud)
与更传统但更老式的
for (int i{ 0 }; i < mPowerUps.size(); ++i)
mPowerUps[i].update(mFT);
Run Code Online (Sandbox Code Playgroud)
,一切正常,应该如此.这告诉我这些2位代码的含义有所不同.据我所知,前者只是后者的新C++语法糖版本.有什么我想念的吗?
更奇怪的是,我的所有功能,
void PowerUpManager::draw(sf::RenderWindow& window) {
for (auto powerUp : mPowerUps)
powerUp.draw(window);
}
Run Code Online (Sandbox Code Playgroud)
,工作正常,没有问题.
我有一张地图如下:
std::map<int, std::unique_ptr<Person>> ratingMap;
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数,它接受一个字符串参数_name并遍历地图,直到它找到一个具有相同名称的人:
void Person::deleteFromMap(const std::string& _name){
//Searches the map for a person whose name is the same as the argument _name
auto found = std::find(ratingMap.begin(), ratingMap.end(),
[&](const std::unique_ptr<Person>& person) -> bool{return person->getName() == _name; });
Run Code Online (Sandbox Code Playgroud)
但是,这拒绝编译并给出以下错误:
错误1错误C2678:二进制'==':找不到哪个运算符带有'std :: pair'类型的左操作数(或者没有可接受的转换)
我已经花了将近两个小时尝试其中的变体以试图让它工作,因为我在过去编写了类似的lambda函数,这些函数已按预期编译和工作.为什么会这样?
说我有一张地图:
std::map<std::unique_ptr<SomeType>, SomeOtherType> map;
Run Code Online (Sandbox Code Playgroud)
显然,这是行不通的,因为我们地图的键值是唯一的ptr,而不是原始的:
//a pointer from somewhere else in the code
SomeType* p = ...;
auto result {map.at(p)};
Run Code Online (Sandbox Code Playgroud)
相反,可以使用std :: unique_ptr.get()执行以下操作:
SomeType* p = ...;
for(auto& entry : map) {
if(entry.first.get() == p) {
//do whatever
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这是一种非常丑陋且可能效率不高的方法。我的问题很简单,在这种情况下是否有某种方式可以使用.at()函数。