2013-06-07 8 views
6

30分前に私はバリデーショナルテンプレートパラメータを発見しましたが、今は完全にフックされています。C++定型テンプレートクラス終了

私は、マイクロコントローラの出力ピンに静的なクラスベースの抽象化を使用しています。私は1つのピンとして扱うことができるようにいくつかの出力ピンをグループ化したい。以下のコードは動作しますが、私はこれを試してみました0パラメータに代わりの1

template< typename pin, typename... tail_args > 
class tee { 
public: 

    typedef tee<tail_args...> tail; 

    static void set(bool b){ 
     pin::set(b); 
     tail::set(b); 
    } 

}; 

template< typename pin > 
class tee<pin> { 
public: 

    static void set(bool b){ 
     pin::set(b); 
    } 

}; 

に再帰を終了することができるはずだと思うけど、コンパイラ(GCC)は、これを考慮していないようだ。

template<> 
class tee<> : public pin_output { 
public: 

    static void set(bool b){} 

}; 

エラーメッセージは長いですが、基本的にはティーがないと言います<>。再帰を終了するには、私のティー<に何か問題が>ありますか、それは不可能です

+0

使用しているGCCのバージョンは何を?それはGCC 4.8ですか? '-std = C++ 11'フラグ(' -Wall'でも可)を渡しましたか? –

+0

あなたのタイプは 'template class tee'でなければなりません。終了ケースは' template <> class tee <> {}; 'でなければなりません。 –

+0

@Basile:4.7.2;私は-std = C++ 0x;を使用しました。 -std = C++ 11を使用すると、ウォールは変更されません。 –

答えて

6

あなたの最も一般的な場合には、少なくとも1引数(pin)を取り、あなたは0引数を持っている専門を作成することはできません。

代わりに、あなたが最も一般的なケースを作る必要があり、それがは、引数のいずれかの量受け入れ:

template<typename...> class tee; 

をそして専門作成:

template< typename pin, typename... tail_args > 
class tee<pin, tail_args...> { 
public: 

    typedef tee<tail_args...> tail; 

    static void set(bool b){ 
     pin::set(b); 
     tail::set(b); 
    } 

}; 

template<> 
class tee<> { 
public: 

    static void set(bool b){} 

}; 
+0

素晴らしい、魅力のような作品、私は私の方法で1つの小さなステップです:) –

関連する問題