2012-09-05 102 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

相关问题