1

這是一個非常基本的問題,我認爲,但我無法找到答案,即使在StackOverflow上也是如此。非常抱歉,如果你想打開我,當你讀這個。模板部分專業化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(){}'[Demo](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++,而首先不要讓整晚的睡眠和豐盛的早餐。你應該已經被教過,在計算機科學101. –

+0

@SamVarshavchik嗯,我認爲這裏值得一提的是,不能在方法聲明中進行**部分**特化,而明確的特殊化如[this](http ://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無論哪一個最容易閱讀,理解和維護。 –