Visual studio 2015 “mem_fun”:不是“std”的成员

Visual studio 2015 “mem_fun”:不是“std”的成员,visual-studio-2015,c++,visual-studio-2013,visual-studio-2005,std,Visual Studio 2015,C++,Visual Studio 2013,Visual Studio 2005,Std,我已经在Visual Studio 2013 Professional中使用CryEngine2 SDK构建的每个项目上遇到这个错误有一段时间了。 大多数时候,我刚刚编辑了以下函数: void CMultipleGrabHandler::Reset() { std::for_each (m_handlers.begin(), m_handlers.end(), std::mem_fun (&CBaseGrabHandler::Reset)); std::vector &

我已经在Visual Studio 2013 Professional中使用CryEngine2 SDK构建的每个项目上遇到这个错误有一段时间了。 大多数时候,我刚刚编辑了以下函数:

void CMultipleGrabHandler::Reset()
{
    std::for_each (m_handlers.begin(), m_handlers.end(), std::mem_fun (&CBaseGrabHandler::Reset));

    std::vector <CAnimatedGrabHandler*>::iterator it = m_handlers.begin();
    std::vector <CAnimatedGrabHandler*>::iterator end = m_handlers.end();
    for ( ; it != end; ++it)
        delete *it;

    m_handlers.erase (m_handlers.begin (), m_handlers.end ());
}
我知道这不是解决问题的好方法,但它摆脱了“mem_-fun”:不是“std”错误的成员

我现在正在寻找解决这个问题的方法,因为我刚刚开始从事一个新项目,稳定是关键;如果我删除CMultipleGrabHandler::Reset的主体,这是不好的,因为在某些情况下它可能会导致崩溃。 我浏览了互联网寻找解决这个问题的方法,但我没有找到任何最接近我发现的东西,那就是对mem_fun所做的事情的解释

我尝试过将std::从mem_-fun中删除,但我刚刚得到一个mem_-fun是未定义的错误,这表明这并不是修复此错误的正确方法

该项目最初是在Visual Studio 2005中创建的,在我第一次打开该解决方案时已迁移到Visual Studio 2013的格式。 这可能是问题的原因吗? 怎么能修好呢

编辑:添加,因为这也适用于新的VS版本。

函数std::mem\u fun在标题中定义

在一些较旧的编译器上,为了使用在该头中定义的函数和类,您不一定需要包含标准库头,因为它可能已经包含在您包含的其他标准库头中。这不是VS独有的;对于较旧的gcc版本(如4.0)也是如此。较新的编译器更符合标准,需要包含定义标准库函数和类的实际头。

函数std::mem\u fun在头中定义


在一些较旧的编译器上,为了使用在该头中定义的函数和类,您不一定需要包含标准库头,因为它可能已经包含在您包含的其他标准库头中。这不是VS独有的;对于较旧的gcc版本(如4.0)也是如此。较新的编译器更符合标准,需要包含定义标准库函数和类的实际头。

旧编译器与新编译器的区别并不完全正确。该标准明确规定,标题可能包括其他标题。@JosephMansfield确实这样说,但我仍然认为我的解释是正确的,但我愿意被证明是错误的。例如,iostream可能包含string,但如果您在程序中包含iostream而不是string,则这不允许实现实际使std::string可用。不,您的解释不正确。当规范说明C++头可以包括其他C++头NS97 97、7.65.2[RES.ON.Healths] / 1时,它是字面意思。因此,从字面上来说,可能包含,并且包含很可能会导致声明例如std::string。旧编译器和新编译器的区别并不是真的。该标准明确规定,标题可能包括其他标题。@JosephMansfield确实这样说,但我仍然认为我的解释是正确的,但我愿意被证明是错误的。例如,iostream可能包含string,但如果您在程序中包含iostream而不是string,则这不允许实现实际使std::string可用。不,您的解释不正确。当规范说明C++头可以包括其他C++头NS97 97、7.65.2[RES.ON.Healths] / 1时,它是字面意思。因此,可以字面上包含,并且包含很可能会导致声明例如std::string。
void CMultipleGrabHandler::Reset()
{
}