1

これは本当に基本的な質問ですが、私はStackOverflowでも答えを見つけることができませんでした。あなたがこれを読むときに私を打つことを望むなら、ごめんなさい。boolのテンプレート部分的特殊化

私はbool値の部分的な特殊化をしたい:

template < typename Object, bool Shared = false > 
class Foo { 

    void bar(); 
}; 

template < typename Object > 
void Foo<Object, true>::bar() {} 

template < typename Object > 
void Foo<Object, false>::bar() {} 

int main() { 

    Foo<int> test; 
    return 0; 
} 

私は考えは正しいと思うが、私は(おそらく本当に愚かな)このコードで何かが欠けている:

Test3.cpp:8:30: error: invalid use of incomplete type ‘class Foo<Object, true>’ 
void Foo<Object, true>::bar() { 
          ^
Test3.cpp:2:7: note: declaration of ‘class Foo<Object, true>’ 
class Foo { 
     ^~~ 
Test3.cpp:13:31: error: invalid use of incomplete type ‘class Foo<Object, false>’ 
void Foo<Object, false>::bar() { 
          ^
Test3.cpp:2:7: note: declaration of ‘class Foo<Object, false>’ 
class Foo { 
+0

あなたはクラスを特化しようとしていることではないでしょうか?特殊化の一部である関数を定義しようとしているようです。 –

+0

関数/メソッドを部分的に特殊化することはできませんが、完全に特殊化することはできます: 'template <> void Foo :: bar(){}' [デモ](http://coliru.stacked-crooked.com/a/18f9ddb32cf72ddd) – Jarod42

答えて

1

テンプレートは関数ではなくクラスを定義します。それはあなたがそのクラスを特化する必要があることを意味し、クラスメソッドではない:

template < typename Object > 
class Foo<Object, false> { 
    void bar(); 
}; 

template < typename Object > 
class Foo<Object, true> { 
    void bar(); 
}; 
+0

ありがとう、私はいくつかの残りが必要です。 –

+0

問題ありません。フル・ナイト・スリープと心のこもった朝食を取らずにC++をコード化するべきではありません。あなたはComputer Science 101でそれを教えておかなければなりません。 –

+0

@SamVarshavchikまあ、ここで言及する価値があるのは、メソッド宣言のクラスを部分的に特殊化することができないことです。 ://melpon.org/wandbox/permlink/i0dGa1WaBgEq3jcn)は完全に有効です。 –

1

もう一つの方法は、FOOを分解し、別のヘルパークラスにバーの実装を扱うことです。これにより、Fooを実装するのに必要な繰返し回数が減ります。例えば

template<class Object, bool Shared> 
struct implement_bar; 

template<class Object> 
struct implement_bar<Object, true> 
{ 
    void operator()(Object& o) const 
    { 
    // do true thing with o 
    } 
}; 

template<class Object> 
struct implement_bar<Object, false> 
{ 
    void operator()(Object& o) const 
    { 
    // do false thing with o 
    } 
}; 

template < typename Object, bool Shared = false > 
class Foo { 

    void bar() 
    { 
    return implement_bar<Object, Shared>()(*this); 
    } 
}; 

int main() { 

    Foo<int> test; 
    return 0; 
} 
+0

どちらが良いでしょうか:splitまたはstd :: enable_if? –

+0

@MathieuVanNevelは、読んで理解して維持するのが一番簡単です。 –

関連する問題