使用enable_if解决多重继承的歧义

时间:2018-07-23 16:02:15

标签: c++ multiple-inheritance name-lookup ambiguous-call

我有一个事件源基类,它定义了一个添加侦听器的函数,并且我试图使用模板参数来解决歧义。但这似乎不起作用-它总是使用第一个基类中的函数,然后抱怨模板参数不匹配:

#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(...)好得多。

1 个答案:

答案 0 :(得分:2)

这两行都会导致错误,因为名称查找不明确(在检查重载是否可行之前)。

您可以使用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 );
    }
};

Demo