2011-06-19 7 views
4

現在、C++ 0xのイベントハンドラシステムに書き込みを行っています。 std::functionオブジェクトに格納できるあらゆる種類の関数/メソッドを渡すことによって、各イベント(複数のハンドラが存在する可能性があります)の「ハンドラ」が登録されます。これは、オーバーロードされた+ =演算子を使用してC#スタイルで行われます。今、私はベクトルに保存されているstd::functionオブジェクトから実際の関数ポインタを取得するための別の内部メソッドを持ってC++ 0x:std :: function :: targetとのエラーとテンプレート引数

template<typename THandlerReturn, typename THandlerArgs...> 
class Event { 
    public: 
     typedef THandlerReturn(HandlerSignature)(THandlerArgs...); 
     typedef THandlerReturn(*HandlerFuntionPtr)(THandlerArgs...); 
     typedef typename std::function<HandlerSignature> HandlerFunction; 

     void operator += (HandlerFunction handler) { 
      _handlers.push_back(handler); 
     } 

     // Some other methods for calling all handlers, ctors, etc. 

    private: 
     std::vector<HandlerFunction> _handlers; 
}; 

:私のイベントクラスは、この(読みやすくするために取り除か)のように、基本的に見えます。これは基本的に次のようなことを試みます:

// Preceeding: Get an iterator 'it' from the vector 
HandlerFunctionPtr pt2func = it->target<HandlerSignature>(); 

この時点で、アプリケーションでEventクラスを使用すると、コンパイルは失敗します。 GCC 4.7のビルドを使用して、私は、上記の行のために、次のエラーメッセージが出ます:戻り値の型がvoidであると仮定すると、私はtarget<>()方法と完全に以下の作品と少しテストしてみた

error: expected primary-expression before '>' token 
error: expected primary-expression before ')' token 

を一つありますタイプintの引数:

typedef THandlerReturn(Signature)(int); 
typedef THandlerReturn(*FunctionPtr)(void); 
std::function<Signature> func; 
FunctionPtr pt2func = func.target<Signature>(); 

typedef void(Signature)(int); 
typedef void(*FunctionPtr)(int); 
std::function<Signature> func; 
FunctionPtr pt2func = func.target<Signature>(); 

しかし、すぐに関与する1つのテンプレート引数があるとして、私は上記の投稿のエラーを取得します

誰かが実際にその理由を教えてもらえますか?もしそうなら、それを動作させる方法があれば教えてください。どんな助けや洞察もありがとう!前もって感謝します!

答えて

5

あなたはとしてtemplateキーワードを使用する必要があります:あなたはタイプテンプレート引数に依存オブジェクトの関数テンプレートを呼び出しているので

HandlerFunctionPtr pt2func = it->template target<HandlerSignature>(); 

その。キーワードtemplateがない場合には、コンパイラは、として全く意味がありません

HandlerFunctionPtr pt2func = ((it->target) < HandlerSignature) >(); 

をあなたのコードを解析しようとしています。したがって、エラー。


templateが必要な理由として、これを詳細に知るために、@Johannesシャウブによって、この優れた説明をお読みください。

+1

うわー、ありがとう!それはトリックでした! :)ああ、私は、テンプレートキーワードがそうすることができ、そうしなければならないことをイベントでは知りませんでした。再度、感謝します! :) – PuerNoctis

+0

余分な説明とリンクをありがとう – PuerNoctis

関連する問題