0

リスナーを追加する関数を定義するイベント ソース基本クラスがあり、あいまいさを解決するためにテンプレート引数を使用しようとしています。しかし、それは機能していないようです-常に最初の基本クラスの関数を使用し、テンプレートパラメーターが一致しないと不平を言います:

#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(...)

4

1 に答える 1