저는 JUCE를 x 플랫폼 프레임 워크로 사용하고 있으며 버튼/콤보 박스 등의 콜백을 특정 처리기 기능에 매핑하는 데 템플릿 수신기 클래스를 사용하고 있습니다. 다른 위젯이 자신의 콜백 함수 이름을 가지고 있기 때문에, 나는 다음과 같은 구조를 사용템플릿이있는 "Listener"처리기 모호성 문제
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 (Button *, ...)와 addHandler (Label *, ...)를 구별 할 수없는 것처럼 addHandler 호출 사이에 모호성이 발생합니다 !! 이 함수들은 템플릿으로 인해 프로토 타입이 다르므로 컴파일러가 왜 저에게 힘든 시간을 주는지 잘 모르겠습니다. 아이디어? 때문에 요청에
는편집 :
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;
};
A :
다른 청취자가있는 클래스처럼 보일 수 있습니다
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
을 입력하고 오류가 발생한 행을 나타냅니다. –
및 인스턴스화에 사용 된 코드 – log0