我无法在C ++ 11中编译一个简单的程序。 您可以在此处查看http://cpp.sh/9muxf。
#include <functional>
#include <iostream>
#include <exception>
#include <tuple>
#include <map>
using namespace std;
typedef int Json;
typedef string String;
class Integer/*: public PluginHelper*/
{
public:
Json display(const Json& in)
{
cout << "bad" << endl;
return Json();
}
map<String, function<Json(Json)>>* getSymbolMap()
{
static map<String, function<Json(Json)>> x;
auto f = bind(&Integer::display, this);
x["display"] = f;
return nullptr;
}
};
问题出现在x["display"] = f;
如果你让我明白这里发生了什么,你会有很大的帮助:)。
std::function
可以不被复制吗?
答案 0 :(得分:2)
Integer::display()
需要一个参数。您应该将其指定为占位符,否则从std::bind生成的仿函数的签名将被视为无效,与function<Json(Json)>
的签名不匹配。
auto f = bind(&Integer::display, this, std::placeholders::_1);
// ~~~~~~~~~~~~~~~~~~~~~
x["display"] = f;
答案 1 :(得分:2)
你的问题在于:
auto f = bind(&Integer::display, this);
Integer::display
接受Json const&
并且您绑定它没有明确的参数。我的gcc拒绝这样的绑定表达式,但是cpp.sh的编译器和我的clang都允许编译,可能是错误的,因为语言标准声明:
*INVOKE* (fd, w1, w2, ..., wN)
[func.require]应该是有效的 某些值的表达式 w1,w2,...,wN ,其中N == sizeof...(bound_args)
您可以通过使绑定的函数对象f
正确来解决问题 - 只需添加Json
参数的占位符:
auto f = bind(&Integer::display, this, placeholders::_1);