我有以下設置,這讓我頭疼,因爲我沒有看到這個問題:模板類構造函數指針成員函數作爲參數
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
[...]
}
編譯器給了我下面的錯誤爲CallBackToMemberSingleArg
和CallBackToMemberReturn
兩個構造函數:
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
的調用給出了上述錯誤,所以肯定還有別的東西,這是我無法看到的。
CallBackToMemberReturn需要一個非const函數指針,但getRatio是一個const限定的成員函數。 – MadScientist
非常感謝。如Henrik所說,必須改變'registerFloat'並且用'TClass *'解決問題。它的全部工作現在。應該看到我的自我,但有時我只是失明。 – christoph