2016-10-04 42 views
0

在我的基類,這是一個公共的非靜態成員函數:如何調用該函數在派生類中處理handle_post(函數調用缺少參數列表創建指針)

void BaseClass::SetPorcessMethod() 
{ 
    //do something 
    Listener.support(methods::POST, this->HandlePost); 
    //do something 
} 

在功能以上,Listener是一個靜態成員變量。 函數HandlePost是由所有派生類實現的純虛函數。我想用this指針從不同派生類中調用不同的HandlePost。 像:

class BaseClass 
{ 
public: 
    static http_listener listener; 
    void SetPorcessMethod(); 
    virtual void HandlePost((http_request request) = 0; 
    /*listener is init in constructor , not display here*/ 
} 
class Derived2:public BaseClass 
{ 
    void HandlePost(http_request request); 
} 
class Derived1:public BaseClass 
{ 
    void HandlePost(http_request request); 
} 

Derived1 instance1; 
instance1.SetPorcessMethod(); 
Derived2 instance2; 
instance2.SetPorcessMethod(); 

然而,它顯示BaseClass::HandlePost:function call missing argument list use &BaseClass::HandlePost:function to create a pointer to member。我知道這是因爲Your code attempts to pass a pointer-to-member-function, which cannot be converted to a pointer-to-function. This is because a pointer-to-member-function can only be called on an object, so it wouldn't know what object to use.Function call missing argument list to create pointer 但我應該怎樣做,這樣我可以從派生類support()調用該函數?

+0

這個問題中缺少一些重要的東西,因爲它根本沒有意義。 –

+0

@CrazyEddie你需要哪些信息? – firstaccount

+1

你不明白的「use&BaseClass :: HandlePost」的哪一部分?看起來像一個相當明確的錯誤消息,它是正確的:這是指定指向類方法的指針的正確語法。請注意,這是一個指向類方法的指針,而不是一個函數,所以你的'support()'方法的第二個參數最好是'void(BaseClass :: *)(http_request)'。如果不是這樣,你會遇到更大的問題,比如破碎的課程設計。 –

回答

2

您試圖將成員函數傳遞給support。爲了調用這樣的函數,調用者需要成員函數參數和指向該實例的指針來調用函數。

但是support預計std::function<void(http_request)>,即沒有實例指針。所以你必須把呼叫換成另一個不需要傳遞實例指針的可調用對象。後者變異

Listener.support(methods::POST, 
    [this](http_request request){return HandlePost(request);}); 

Listener.support(methods::POST, 
    std::bind(&BaseClass::HandlePost, this, std::placeholders::_1)); 

#include<functional>:你可以做到這一點與一個lambda(或者std::bind如果您願意)。

+0

你從哪裏得到'support()'需要'std :: function'作爲輸入的想法?這在問題,編輯或評論的任何地方都沒有說明。說的是,編譯器錯誤期望有一個'指向函數的指針',所以'support()'實際上期望一個普通的'void(*)(http_request)'函數指針。你不能使用捕獲lambda。 –

+1

@RemyLebeau問題不明確,但考慮到標籤,我認爲他們正在使用這個庫:https://github.com/Microsoft/cpprestsdk。我查了'Listener.support'的簽名,假設'Listener'是來自該庫的'http_listener'。此外,這個問題中的引用不是錯誤信息的一部分,而是引用另一個問題,我想。 – user4407569

+0

這是一個關於圖書館的好消息。 –

相關問題