我使用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操作(按鍵* ...)和addHandler操作(標籤* ...)之間distiguish!這些功能是不同的原型由於被模板化的,所以我不知道爲什麼編譯器是給我一個困難時期。想法?
編輯因請求:
與不同的聽衆類可能看起來像:
MyClass::MyClass()
{
...
addHandler(m_btn, &MyClass::buttonHandlerFunction); <<< error
addHandler(m_label, &MyClass::labelHandlerFunction); <<< error
}
和錯誤是::
class MyClass : public ButtonListenerHandler<MyClass>
, public LabelListenerHandler<MyClass>
{
...
void buttonHandlerFunction();
void labelHandlerFunction();
Button* m_btn;
Label* m_label;
};
其中錯誤出現
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>'
請問您可以發佈完整的編譯器消息嗎? – Philipp 2011-03-20 11:26:27
並指示哪條線路導致錯誤。 – 2011-03-20 11:36:39
,並用於實例 – log0 2011-03-20 11:37:18