繁体   English   中英

SFML和STL:我的代码有什么问题?

[英]SFML and STL: What's wrong with my code?

我有以下代码片段:

void RemoveButton::triggerAction(team &team, unsigned int index)
{
    switch (mAction)
    {
        case Action::remove:

        {
            //team.mTeamMembers.erase(std::remove(team.mTeamMembers.begin(), team.mTeamMembers.end(), team.mTeamMembers.at(index)), team.mTeamMembers.end());
            team.mTeamMembers.erase(team.mTeamMembers.begin() + index);

            for (unsigned int i = index; i < team.mTeamMembers.size(); i++)
            {
                team.mTeamMembers[i].mRemoveButton->getText().move(0.0f, -30.0f);
                team.mTeamMembers[i].mText.move(0.0f, -30.0f);
            }

            team.mAddPosition.y -= 30.0f;
            break;
        }

        default:break;
    }
}

class team
{
public:
    size_t                                        teamNumber;
    std::vector<AddButton>                        mAddButtons;
    std::vector<teamRecord>                        mTeamMembers;

    sf::Sprite                                    mBorder;
    sf::Text                                    mText;
    Selector<AddButton>                            mAddButtons_Selector;
    sf::Vector2f                                mAddPosition;
    Selector<teamRecord>                        mTeamMembers_Selector;

    team(sf::Vector2f borderPosition, sf::Vector2f removeButtonsPosition, sf::Vector2f textPosition, size_t teamNumb, std::string text);
};

应该如何删除team.mTeamMembers STL向量中的元素? 目前,我执行此操作的方式会导致看似随机的执行错误,尤其是在单击已删除按钮的不存在的精灵时。 使用std :: remove的注释行未编译,我不明白为什么。 当我感到困惑后,有人可以在这里发光吗? 这是一些用户在此论坛上建议的使用std :: remove时的构建日志:

1>------ Build started: Project: Complex OOP Menus, Configuration: Release Win32 ------
1>  RemoveButton.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\algorithm(1454): error C2678: binary '==': no operator found which takes a left-hand operand of type 'teamRecord' (or there is no acceptable conversion)
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(389): note: could be 'bool std::operator ==(const std::error_condition &,const std::error_condition &) noexcept'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(381): note: or       'bool std::operator ==(const std::error_condition &,const std::error_code &) noexcept'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(373): note: or       'bool std::operator ==(const std::error_code &,const std::error_condition &) noexcept'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\system_error(365): note: or       'bool std::operator ==(const std::error_code &,const std::error_code &) noexcept'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\exception(339): note: or       'bool std::operator ==(const std::exception_ptr &,std::nullptr_t) throw()'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\exception(334): note: or       'bool std::operator ==(std::nullptr_t,const std::exception_ptr &) throw()'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\exception(329): note: or       'bool std::operator ==(const std::exception_ptr &,const std::exception_ptr &) throw()'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\algorithm(1454): note: while trying to match the argument list '(teamRecord, const teamRecord)'
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\algorithm(1467): note: see reference to function template instantiation '_FwdIt std::_Remove_unchecked<teamRecord*,_Ty>(_FwdIt,_FwdIt,const _Ty &)' being compiled
1>          with
1>          [
1>              _FwdIt=teamRecord *,
1>              _Ty=teamRecord
1>          ]
1>  ..\Data\Source\RemoveButton.cpp(24): note: see reference to function template instantiation '_FwdIt std::remove<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<teamRecord>>>,teamRecord>(_FwdIt,_FwdIt,const _Ty &)' being compiled
1>          with
1>          [
1>              _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<teamRecord>>>,
1>              _Ty=teamRecord
1>          ]

如果这里没有足够的信息,我可以将github链接发布到我的项目中,但是它很大,并且需要花一些时间来浏览代码。

如果您已经知道位置/偏移量,并且只想删除一个条目,则使用std::remove()对我来说没有任何意义。

您收到std::remove()错误的原因很可能是因为没有为teamRecord类定义相等运算符( operator == )(或者找不到)。

目前,我执行此操作的方式会导致看似随机的执行错误,尤其是在单击已删除按钮的不存在的精灵时。

除非我们看到与此相关的代码,否则我们将无法看清这一点。 您如何单击不存在的内容? 您是否只是错过了支票或没有正确清理东西?

我通过仔细检查插入时赋予元素的索引来解决此问题。 谢谢,抱歉犯了这么愚蠢的错误!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM