代码之家  ›  专栏  ›  技术社区  ›  riv

使用启用\u if解决多重继承歧义

  •  0
  • riv  · 技术社区  · 6 年前

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

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

    为什么这不属于斯芬纳?

    我知道我可以显式地指定基类,但是模板看起来比 EventSource<Event1>::addListener(...) .

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jarod42    6 年前

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

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