2012-09-05 101 views
0

我有以下設置,這讓我頭疼,因爲我沒有看到這個問題:模板類構造函數指針成員函數作爲參數

ValidationModule module = ValidationModule(std::vector<FilterFlag>(0)); 
Settings validationSettings = Settings("Validation Settings"); 
validationSettings.registerFloat("test", module, &ValidationModule::setRatio, &ValidationModule::getRatio, 0.0f, 1.0f); 

registerFloat需要兩個指針的ValidationModule

成員函數

ValidationModule.h

// constructor 
ValidationModule(const std::vector<FilterFlag>& filterFlags, float ratio = 0.7f); 

// getter and setter, which are passed to Settings::registerFloat 
inline void setRatio(float value) { _ratio = value; } 
inline float getRatio() const { return _ratio; } 

Settings.h

template<class TClass> 
inline void Settings::registerFloat(const std::string& name, TClass owner, void (TClass::*setter)(float), float (TClass::*getter)() const, float minValue, float maxValue) 
{ 
    CallBackToMemberSingleArg<float, TClass>* setterCallback = new CallBackToMemberSingleArg<float, TClass>(owner, setter); 
    CallBackToMemberReturn<float, TClass>* getterCallback = new CallBackToMemberReturn<float, TClass>(owner, getter); 
    // some unrelated processing 
    [...] 
} 

編譯器給了我下面的錯誤CallBackToMemberSingleArgCallBackToMemberReturn兩個構造函數:

No matching constructor for initialization of 'CallBackToMemberSingleArg<float, ValidationModule>' 
No matching constructor for initialization of 'CallBackToMemberReturn<float, ValidationModule>' 

下面是構造函數聲明

Callback.h

template <typename TParam> 
class CallBackSingleArg 
{ 
public: 
    virtual ~CallBackSingleArg() { } 
    virtual void call(const TParam& p) = 0; 
}; 

template <typename TParam, typename TClass> 
class CallBackToMemberSingleArg : public CallBackSingleArg<TParam> 
{ 
    void (TClass::*function)(const TParam&); 
    TClass* object; 
public: 
    CallBackToMemberSingleArg(TClass* object, void(TClass::*function)(const TParam&)) : object(object), function(function) { }; 
    void call(const TParam& p) { 
     (*object.*function)(p); 
    } 
}; 

template <typename TParam> 
class CallBackReturn 
{ 
public: 
    virtual ~CallBackReturn() { } 
    virtual TParam call() = 0; 
}; 

template <typename TParam, typename TClass> 
class CallBackToMemberReturn : public CallBackReturn<TParam> 
{ 
    TParam (TClass::*function)(); 
    TClass* object; 
public: 
    CallBackToMemberReturn(TClass* object, TParam(TClass::*function)()) : object(object), function(function) { }; 
    TParam call() { 
     return (*object.*function)(); 
    } 
}; 

我試着將實際的設置器更改爲void setRatio(const float& value),因爲CallBackToMemberSingleArg需要一個const引用參數,但這並沒有幫助,並且對構造函數CallBackToMemberReturn的調用給出了上述錯誤,所以肯定還有別的東西,這是我無法看到的。

+0

CallBackToMemberReturn需要一個非const函數指針,但getRatio是一個const限定的成員函數。 – MadScientist

+0

非常感謝。如Henrik所說,必須改變'registerFloat'並且用'TClass *'解決問題。它的全部工作現在。應該看到我的自我,但有時我只是失明。 – christoph

回答

0

您將TClass作爲第一個參數傳遞給CallBackToMemberSingleArg構造函數,但預計需要TClass*

+0

非常感謝。這也是MadScientist指出的問題。 – christoph

相關問題