2016-11-18 173 views
0

我無法編譯C++ 11中的簡單程序。 你可以在這裏看看http://cpp.sh/9muxfC++ std :: function operator =

#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;

你有很大的幫助,如果你讓我明白髮生了什麼在這裏:)到來。 Can std::function不能被複制?

+0

沒有編譯器或許發出錯誤訊息? – juanchopanza

+0

有些人認爲綁定現在沒用了,因爲有lambda/closures,所以考慮'auto f = [this](Json j) - > Json {return display(j);};'作爲替代 – PeterT

+1

您需要'#include ' –

回答

2

你的問題就在這裏:

auto f = bind(&Integer::display, this); 

Integer::display需要Json const&你綁定它沒有明確的參數。我的GCC拒絕這樣的綁定表達式,但兩者cpp.sh的編譯器和我的鏗鏘讓這個編譯,可能是不正確的,因爲語言標準規定:

*INVOKE* (fd, w1, w2, ..., wN) [func.require]應是一些有效的 表達值W1,W2,...,WN,其中 N == sizeof...(bound_args)

您可以通過您的綁定函數對象f正確解決您的問題 - 只需添加一個佔位符Json參數:

auto f = bind(&Integer::display, this, placeholders::_1); 

demo

2

Integer::display()取一個參數。您應該指定它作爲佔位符,否則從std::bind生成的仿函數的簽名將被視爲無效,這與function<Json(Json)>的簽名不匹配。

auto f = bind(&Integer::display, this, std::placeholders::_1); 
//          ~~~~~~~~~~~~~~~~~~~~~ 
x["display"] = f; 

LIVE

相關問題