2016-04-05 16 views
0

クラス内に2つの関数があります。1つはオペレータのデフォルトのspec +です。何らかの関数を期待しています.2番目のspecilizationはEventHandlerを必要とします。明示的な関数テンプレートの特殊化により、間違った特殊化が選択される

template<typename _Func> 
    timed_function<_Sig>& operator+=(_Func &&f) 
    { 
     // Create an unamed handler 
     auto handler = new EventHandler<_Sig>("unamed", std::forward<_Func>(f)); 

     // Push it 
     _fs.push_back(handler); 

     // Return a reference to the function 
     return handler->get(); 
    } 

は、ここで特殊なバージョンです:_fsEventHandler<_Sig>ポインタの単なるベクトルである

template<> 
timed_function<_Sig>& operator+=<const EventHandler<_Sig>&>(const EventHandler<_Sig> &_Handler) 
{ 
    // Copy the handler and push it 
    _fs.push_back(new EventHandler<_Sig>(_Handler)); 

    // Return a reference to the function 
    return _fs.back()->get(); 
} 

。 そして_Sig関数シグネチャ(例えばvoid(int)

例えばラムダ関数に+ =演算子を使用する場合、それはうまく動作し、コンパイラが正しい専門選ぶこと:

window->OnKeyDown() += [](dx::Window *sender, dx::KeyDownArgs &args) 
{ 
    [...] 
}; 

OnKeyDown()する参照を返しますEvent<void(dx::Window*, dx::KeyDownArgs&)>

しかし、このようなEventHandlerを手作業で追加しようとすると、特殊化されていないバージョンの関数が選択されます。

window->OnKeyDown() += EventHandler<void(dx::Window*, dx::KeyDownArgs&)>("Key Handler", 
         [](dx::Window *sender, dx::KeyDownArgs &args) 
         { 
          [...] 
         }); 

ありがとうございます!

+0

'dx :: EventHandler'は' EventHandler'と同じですか? – SergeyA

+0

はい、理解しやすくするために削除します。ありがとうございます。 – PsychoBitch

答えて

0

、単にテンプレートの特殊から参照を削除、ある

template<> 
timed_function<_Sig>& operator+=<const EventHandler<_Sig>>... 

を使用しています。ここでは専門のこの種がどのように動作するかを例である - 調理アップタイプではなく、有用なはずである。

http://coliru.stacked-crooked.com/a/297df51929329484

(コンパイラによっては、あなたが「の間のスペースを入れなければならないかもしれません>> '専門分野で)。

+0

これは奇妙なことに、同じ行で同じ正確なエラーが約140回トリガされます。特殊化から参照を削除すると、コンパイラーは特殊化が悪い形式であると言います。 @ SergeyA – PsychoBitch

+0

@PsychoBitch、専門の完全なコードを提供してください。あなたは間違いなくそこに問題を抱えています。 – SergeyA

+0

ここに:http://pastebin.com/nxTRdbtN – PsychoBitch

1

あなたはconst EventHandler<_Sig>&ではなく、EventHandler<_Sig>&&を提供するので、特殊化されていないバージョンが選択されます。適切に特化し

+0

私はそれが原因かもしれないと考えました、問題はどうやって解決しますか?ありがとう。 – PsychoBitch

+0

@PsychoBitch、私の答えを見てください。 – SergeyA

+0

@PsychoBitch:テンプレートを 'テンプレート timed_function &演算子+ =(const F&f)'に変えるのは解決策かもしれません。 SFINAEと(ヘルパー)構造体の他の、または部分的なspetialisationをオーバーロードします。また、SergeyAが提案しているように電話で明示してもかまいません。 – Jarod42

関連する問題