2011-06-29 20 views
2

OK私が持っている:テンプレートの特殊化は

template<typename T> 
class Reader 
{ 
    class Input 
    { 
     template<typename C> 
     void operator()(C& val) const 
     { 
      /* Do Some Work */ 
     } 
    }; 
}; 

あいにくのジェネリック版私のために動作しません「いくつかの作業を行います」。また、重いテンプレートのメタプログラミングコードの途中にあるので、変更するのも簡単ではありません。

私は私のタイプのためのメソッドを特化することができますが、だから。だから私の第一歩は、一般的な方法をクラスから取り除くことでした。

template<typename T> 
class Reader 
{ 
    class Input 
    { 
     template<typename C> 
     void operator()(C& val) const; 
    }; 
}; 


template<typename T> 
template<typename C> 
void typename Reader<T>::Input template operator()<C>(C& val) const // LINE 13 
{ 
    /* Do Some Work */ 
} 

残念ながら、私はエラーを取得しています:

s.h:13: error: error: expected ‘)’ before ‘&’ token

答えて

4

普通

template<typename T> 
template<typename C> 
void Reader<T>::Input::operator()(C& val) const // LINE 13 
{ 
    /* Do Some Work */ 
} 

のようにそれを書くには特別なバージョンを提供するのお手伝いをしていないクラスのうちのジェネリック版の定義しかし、私はここであなたの目標を逃しています。

+0

入力はテンプレートクラスではありません。 –

+0

@Peterありがとう。間違い:) –

+0

ありがとうございます。あなたは正しいです、私は方法を専門にすることはできません。もう一度別の指先で作業する。ありがとう。 –

0

部分機能テンプレートの特殊化は認められませんが、これは許されません。 void Reader<T>::Input::operator() (C& int)は、タイプReader<T>::Input *の暗黙の第1引数(ポインタ)を持ちます。したがって、その署名は実際にはvoid (Reader<T>::Input *, C &)です。 Cを指定しようとしていますが、Tは指定していません。

関連する問題