2013-05-31 20 views
3

請參閱以下代碼。第一個MyClass有兩個函數(func1和func2)。然後我想在func1中爲MyClass做一些特殊的事情,但不是func2。看起來我必須再次輸入func2的代碼。我想知道是否有辦法解決這個問題?謝謝模板專業化:我們可以部分實施特殊案例

#include <iostream> 

using namespace std; 

template <class T> 
class MyClass { 
public: 
    void func1(){ 
    cout<<"default: func1"<<endl; 
    } 
    void func2(){ 
    cout<<"default: func2"<<endl; 
    } 
private: 
    T haha; 
}; 

template <> 
class MyClass<double> { 
public: 
    void func1(){ 
    cout<<"special: func1"<<endl; 
    } 
}; 

int main() 
{ 
    MyClass<int> intclass; 
    intclass.func1(); 
    intclass.func2(); 

    MyClass<double> doubleclass; 
    doubleclass.func1(); 
    doubleclass.func2(); // error 'class MyClass<double>' has no member named 'func2' 
    return 0; 
} 

回答

4

沒有必要爲整個班級提供專業化。你可以專攻特定成員函數:

template <> 
void MyClass<double>::func1() { 
    cout<<"special: func1"<<endl; 
} 

現場演示here

+0

謝謝。它適用於這個例子。但在我的工作情況中,模板部分將用於首先構建一個靜態庫,然後編譯器會投訴重複的定義。還有什麼評論? –

+0

@YanZhu使'inline'專業化。 – mfontanini

+0

謝謝。它通過鏈接。這背後的理論是什麼?你能爲此點點文章嗎?我試過谷歌,但找不到任何有用的東西。 –