Я реализовал шаблон базовый класса для шаблона наблюдателя,Переопределенная проблема указателя функции в шаблоне базового класса C++
template<class T>
class ActionListener
{
public:
ActionListener(void);
virtual ~ActionListener(void);
void registerListener(T* listener);
void unregisterListener(T* listener);
template<typename Signal>
void emit(Signal signal);
template<typename Signal, typename Parameter>
void emit(Signal signal, const Parameter& parameter);
template<typename Signal, typename Parameter1, typename Parameter2>
void emit(Signal signal,
const Parameter1& parameter1,
const Parameter2& parameter2);
private:
std::vector<T*> mListenerList;
};
class IEventListener
{
public:
virtual void messageArrived(Message* message);
virtual void messageArrived(ClientHandle* handle, Message* message);
};
я использую классы как этого
emit(&IEventListener::messageArrived, message);
emit(&IEventListener::messageArrived, mHandle, message);
проблема здесь есть, компилятор не может вывести параметры шаблона, и я не мог явно задать параметры шаблона?
У кого-то есть идея?
EDIT: Проблема здесь - переопределенная функция вызова с параметрами шаблона. Функция «Испускать» работает правильно для других типов функций.
Использование этого шаблона
class SampleClass : public ActionListener<IEventListener>
{
//some stuff here
//this class is observing events of IEventListener
}
, кстати это C++.
Почему вы не можете явно указать тип параметра шаблона? – Locksfree
«... компилятор не может вывести параметры шаблона ...» Какое сообщение об ошибке? – sbi
Мне трудно понять, что вы пытаетесь сделать. Добавьте дополнительные пояснения. Вы оставили определение Message и не упомянули, как ActionListener должен взаимодействовать с IEventListener. Ваши фрагменты кода не совсем понятны. Я думаю, вы пытаетесь эмулировать дженерики Java-стиля здесь, где T - тип класса, который происходит от IEventListener. Но я не уверен. – sellibitze