使用enable_if解决多重继承歧义
Resolving multiple inheritance ambiguity with enable_if
我有一个事件源基类,它定义了一个添加侦听器的函数,我正在尝试使用模板参数来解决歧义。但这似乎不起作用——它总是使用第一个基类中的函数,然后抱怨模板参数不匹配:
#include <type_traits>
template<class Event>
class EventSource
{
public:
class Listener
{
public:
virtual void handle( const Event& e ) = 0;
};
template<class EventType>
typename std::enable_if<std::is_same<Event, EventType>::value, void>::type
addListener( Listener* ptr );
};
class Event1 {};
class Event2 {};
class MultiListener : public EventSource<Event1>::Listener, public EventSource<Event2>::Listener
{
public:
void handle( const Event1& e );
void handle( const Event2& e );
};
class MultiSource : public EventSource<Event1>, public EventSource<Event2>
{
public:
void addMultiListener( MultiListener* ptr )
{
addListener<Event1>( ptr );
addListener<Event2>( ptr ); // this line causes error
}
};
为什么这不属于SFINAE?
我知道我可以显式地指定基类,但模板看起来比EventSource<Event1>::addListener(...)
好得多。
这两行都会导致错误,因为名称查找不明确(在检查重载是否可行之前(。
您可以使用using
来解决问题
class MultiSource : public EventSource<Event1>, public EventSource<Event2>
{
using EventSource<Event1>::addListener;
using EventSource<Event2>::addListener;
public:
void addMultiListener( MultiListener* ptr )
{
addListener<Event1>( ptr );
addListener<Event2>( ptr );
}
};
演示
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 引用如何解决多重继承中的歧义
- 如何处理同一模板多重继承中的歧义
- 消除多重继承中类成员的歧义
- 与 [] 运算符和多重继承的歧义
- 关于多重继承和歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 多重虚拟继承歧义
- c++多重继承有歧义
- 多重继承歧义基类