-1

私は、学校プロジェクト用の反応的なGUIを備えた小さなアプリケーションの設定を容易にするために、EventProvider/Handlerシステムを実装しようとしています。より広範なObserverパターンへのこの特定のアプローチは必須ではありませんが、実際には可能であれば、最も堅牢で軽量のようです。私はこれまで、独自の微細構築してきたが、私は実際に試してみて、含まれ、このヘッダを、他の場所でコードを使用している場合、私はエラーの数十、それらのすべての複製を取得...単純なEventHandler /バリデーショナルテンプレートと関数ポインタを使用するプロバイダ

#pragma once 

#include <vector>; 
#include <algorithm>; 

/// Provides a lightweight interface for implementing event-based behaviour. 
template <class ...arg> class EventProvider 
{ 
public: 
    /// Defines a pointer to a function equipped to handle an event from this provider. 
    typedef void(*EventHandler)(arg... arguments); 

    EventProvider(); 
    virtual ~EventProvider(); 

    void Subscribe(EventHandler handler); 
    void Unsubscibe(EventHandler handler); 

    void Notify(arg... arguments); 

protected: 
    vector<EventHandler> _handlers; 
}; 

template<class ...arg> 
EventProvider<...arg>::EventProvider() 
{} 

template<class ...arg> 
EventProvider<...arg>::~EventProvider() 
{} 

template<class ...arg> 
inline void EventProvider<...arg>::Notify(arg... arguments) 
{ 
    for (auto handler : _handlers) 
    { 
     handler(arguments); 
    } 
} 

template<class ...arg> 
inline void EventProvider<...arg>::Subscribe(EventHandler handler) 
{ 
    if (find(_handlers.begin(), _handlers.end(), handler) == _handlers.end()) 
    { 
     _handlers.push_back(handler); 
    } 
} 

template<class ...arg> 
inline void EventProvider<...arg>::Unsubscibe(EventHandler handler) 
{ 
    _handlers.erase(remove(_handlers.begin(), _handlers.end(), handler),  _handlers.end()); 
} 

すべてのオン

vector<EventHandler> _handlers; 

C2509 syntax error: '...'

C3211 'EventProvider<>::FunctionName': explicit specialization is using partial specialization syntax, use template <> instead

:私はのEventHandlerの私のベクトルを宣言した行で

C2238 unexpected token(s) preceding ';'

C2143 syntax error: missing ';' before '<'

C4430 missing type specifier - int assumed. Note: C++ does not support default-int

template<class ...arg> 
EventProvider<...arg>::EventProvider() 
{} 
+0

エラーメッセージが表示された場合は、適用する行を説明してください。 –

+0

エラーの各ブロックの下に、エラーがリンクされている行を示しました。 – ophilbinbriscoe

答えて

0

1)あなたは

template<class ...arg> 
inline void EventProvider<arg...>::Notify(arg... arguments) 
{ 
    for (auto handler : _handlers) 
    { 
     handler(arguments); 
    } 
} 

EventProvider<arg...>:: 

代わりの

EventProvider<...arg>:: 

2)を書き込む必要があります。のようなクラステンプレートの宣言次の実装での関数のシグネチャ、

argumentsは可変パラメータなので、...で解凍する必要があります。私は、あなたがvectorstd::を使用する必要が

protected: 
    vector<EventHandler> _handlers; 

handler(arguments ...); 

3)とし(あるいはそうinclude後のセミコロンの必要はありません))using namespace std;

4を追加しますしてください、

#include <vector> 
#include <algorithm> 

代わりに

#include <vector>; 
#include <algorithm>; 
+0

ありがとう! Yikesは、ネームスペースを含み、欠落した後のセミコロンはクローゼット内のスケルトンで、私はC++の行を書かなかった9月にこのプロジェクトを開始しました。 残りはすべて意味があります。これはvariadicテンプレートへの私の最初の進出であり、あなたは非常に役立っています。乾杯。 – ophilbinbriscoe

関連する問題