我使用 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>'