2015-04-01 126 views
0

我試圖將成員函數作爲參數傳遞給模板函數。我已經閱讀了Stackoverflow中有關將成員函數作爲參數傳遞給其他函數的所有線程。但是,不知何故,我不明白這個簡單的東西的工作:將成員函數作爲回調函數傳遞給模板函數

template <typename T> 
T Class::registerCallback(std::function<T()> callback) { 
    // do something 
} 
bool Class::member() { 
    return true; 
} 
void Class::method() { 
    registerCallback(std::bind(&Class::member, this, std::placeholders::_1)); 
} 

我收到的錯誤消息是:

no matching member function for call to 'registerCallback' 

我試圖解決這個問題很長一段時間。如果有人能指出我出了什麼問題,我將非常感激。

+0

是'Class'模板或者它只是有一個模板成員函數? – 2015-04-01 05:45:02

+0

只是一個模板成員函數。 – einstein 2015-04-01 05:47:15

+0

@JamesAdkison我解決了它只是提供了類型registerCallback (std :: bind(&Class :: member,this,std :: placeholders :: _ 1)); – einstein 2015-04-01 05:52:45

回答

1

必須註冊的回調沒有任何參數。

的std ::函數< T()>

然而,試圖註冊它接受一個參數的回調。

的std ::綁定(&類::構件,爲此,性病::佔位符:: _ 1)

此外,Class::member函數不具有任何參數。

試試這個:

class Class 
{ 
public: 
    // I'm not sure why this was returning a 'T' changed to 'void' 
    template<typename T> 
    void registerCallback(std::function<T()> callback) 
    { 
     // do something 
    } 

    void method() 
    { 
     // The 'member' function doesn't have any parameters so '_1' was removed 
     registerCallback<bool>(std::bind(&Class::member, this)); 
    } 

    // The callback is supposed to return 'T' so I changed this from 'bool' 
    bool member() 
    { 
     return true; 
    } 
}; 

int main() 
{ 
    Class<bool> c; 
    c.method(); 

    return 0; 
} 
+0

但我不想設置模板類?有沒有解決方案,我可以設置模板方法?我也刪除了'std :: placeholders :: _ 1',仍然給我同樣的錯誤。 – einstein 2015-04-01 05:46:17

+0

@einstein我以爲我看到了將所有函數定義爲模板的原始問題......無論如何,我已經更新了答案。 – 2015-04-01 05:50:47

+0

謝謝@詹姆斯! – einstein 2015-04-01 05:53:28

相關問題