Я использую JUCE в качестве платформы x-платформы и использую классы слушателей шаблонов для сопоставления обратных вызовов кнопки / комбинированного списка и т. Д. С определенными функциями-обработчиками. Поскольку разные виджеты имеют собственное имя функции обратного вызова, я использую следующую структуру:
template<typename Type, typename Widget>
class ListenerBase : public Widget::Listener
{
public:
typedef void (Type::*TCallbackType)(void);
protected:
void notifyCallback(Widget* notifier)
{
...
}
void addHandler(Widget* notifier, TCallbackType callback)
{
notifier->addListener(this);
...
}
};
template<typename Type>
class ButtonListenerHandler : public ListenerBase<Type, Button>
{
protected:
void buttonClicked(Button* btn)
{
notifyCallback(btn);
}
};
template<typename Type>
class LabelListenerHandler : public ListenerBase<Type, Label>
{
protected:
void labelTextChanged(Label* lbl)
{
notifyCallback(lbl);
}
};
И это прекрасно работает, пока я использую только одну из специализаций обработчиков в моем классе. Как только я использую более одного, VC ++ 2008 жалуется на неоднозначность между вызовами addHandler, как будто компилятор не может различить addHandler (Button *, ...) и addHandler (Label *, ...) !! Эти функции имеют разные прототипы из-за того, что их шаблонизируют, поэтому я понятия не имею, почему компилятор доставляет мне неприятности. Идеи?
Изменить из-за запросов:
Класс с разными слушателями может выглядеть так:
class MyClass : public ButtonListenerHandler<MyClass>
, public LabelListenerHandler<MyClass>
{
...
void buttonHandlerFunction();
void labelHandlerFunction();
Button* m_btn;
Label* m_label;
};
A, где возникает ошибка:
MyClass::MyClass()
{
...
addHandler(m_btn, &MyClass::buttonHandlerFunction); <<< error
addHandler(m_label, &MyClass::labelHandlerFunction); <<< error
}
И ошибка:
1>MyClass.cpp(287) : error C2385: ambiguous access of 'addHandler'
1> could be the 'addHandler' in base 'ListenerBase<MyClass,juce::Button>'
1> or could be the 'addHandler' in base 'ListenerBase<MyClass,juce::Label>'