gpt4 book ai didi

c++ - 模板化 "Listener"处理程序歧义问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:37 27 4
gpt4 key购买 nike

我使用 JUCE 作为 x 平台框架,我使用模板监听器类将按钮/组合框等回调映射到某些处理程序函数。由于不同的widgets有自己的回调函数名,我使用如下结构:

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);
}
};

只要我在我的类(class)中只使用一个处理程序特化,它就可以正常工作。一旦我使用多个,VC++ 2008 就会提示 addHandler 调用之间存在歧义,就好像编译器无法区分 addHandler(Button*, ...) 和 addHandler(Label*, ...) !由于被模板化,这些函数具有不同的原型(prototype),所以我不知道为什么编译器给我带来了困难。想法?

应要求编辑:

具有不同听众的类可能如下所示:

class MyClass : public ButtonListenerHandler<MyClass>
, public LabelListenerHandler<MyClass>
{
...
void buttonHandlerFunction();
void labelHandlerFunction();

Button* m_btn;
Label* m_label;
};

错误发生的地方:

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>'

最佳答案

编辑
好吧,在重新考虑一切之后,问题出在ListenerBase<MyClass, Button>ListenerBase<MyClass, Label>每个定义一个 addHandler函数,由于继承,它似乎不算重载,即使它们具有不同的签名(一个带有 Button* 参数,另一个带有 Label* 参数)。我为此找到的一个可能的修复方法是完全限定对 addHandler 的调用。 ,有点冗长,也许不是真正想要的,但它有效(为方便起见,我 typedef 'd 基类):

template<class Type>
class ButtonListenerHandler : public ListenerBase<Type, Button>{
public:
typedef ListenerBase<Type, Button> ButtonListenerBase;
};

template<class Type>
class LabelListenerHandler : public ListenerBase<Type, Label>{
public:
typedef ListenerBase<Type, Label> LabelListenerBase;
};

class MyClass : public ButtonListenerHandler<MyClass>,
public LabelListenerHandler<MyClass>{
public:
void buttonHandlerFunction();
void labelHandlerFunction();

MyClass(){
ButtonListenerHandler<MyClass>::addHandler(m_btn, &MyClass::buttonHandlerFunction);
LabelListenerHandler<MyClass>::addHandler(m_label, &MyClass::labelHandlerFunction);
}

private:
Button* m_btn;
Label* m_label;
};

'另一个编辑
感谢对 my question here 的快速回答,我可以给它另一个编辑。 using那里提到的方法也适用于您的问题。 :)

class MyClass : public ButtonListenerHandler<MyClass>,
public LabelListenerHandler<MyClass>{
public:
using ButtonListenerHandler<MyClass>::addHandler;
using LabelListener<MyClass>::addHandler;

void buttonHandlerFunction(){
}
void labelHandlerFunction(){
}

MyClass(){
addHandler(m_btn, &MyClass::buttonHandlerFunction);
addHandler(m_label, &MyClass::labelHandlerFunction);
}

private:
Button* m_btn;
Label* m_label;
};

关于c++ - 模板化 "Listener"处理程序歧义问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5368146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com