1

我刚刚将 2010 vs 解决方案导入 2012。

现在,当我编译程序(在 2010 年成功编译)时失败并出现几个错误,例如:

 c:\users\frizzlefry\documents\visual studio 2010\projects\menusystem\menusystem\ktext.cpp(288) : see reference to function template instantiation 'std::function<_Fty> &std::function<_Fty>::operator =<int>(_Fx &&)' being compiled
1>          with
1>          [
1>              _Fty=void (void),
1>              _Fx=int
1>          ]

转到 KText.cpp 中的第 288 行是在这个函数中:

void KText::OnKeyUp(SDLKey key, SDLMod mod, Uint16 unicode) {
    IsHeld.Time(500);       //Reset first repeat delay to 500 ms.
    IsHeld.Enable(false);   //Turn off timer to call the IsHeld.OnTime function.
    KeyFunc = NULL;     //LINE 288  //Set keyFunc to NULL 
}

我检查了其中的一些,它们都与设置std::function<void()> funcNULL.

显然,我可以通过并更改一堆线,但我的程序设置方式检查:

if(func != NULL) func();

我该如何替换这种功能?

4

2 回答 2

2

例如,如果您看到赋值运算符的这个引用,std::function那么实际上没有重载可以接受任何可能的内容(通常是在 C++ 中NULL定义的宏)。0但是您可以将例如分配nullptr给函数对象(根据参考中的重载 3):

KeyFunc = nullptr;

比较相同,使用nullptr代替NULL。或者,正如 juanchopanza 在评论中所建议的那样,使用boolcast operator

于 2013-11-06T07:54:13.017 回答
1

我宁愿让库决定实例的默认构造值是什么:function<>

KeyFunc = {}; // uniform initialization (c++11)
// or
KeyFunc = KeyFuncType(); // default construct

带有断言的演示:在 Coliru 上实时观看

#include <functional>
#include <cassert>

int main()
{
    using namespace std;

    function<int(void)> f = [] { return 42; };

    assert(f);
    assert(42 == f());

    f = nullptr;
    assert(!f);

    f = {};
    assert(!f);
}

如果您的编译器没有统一初始化的功能,请使用 typedef:

typedef function<int(void)> Func;

Func f = [] { return 42; };
assert(f);

f = Func();
assert(!f);
于 2013-11-06T08:01:25.837 回答