2011-09-23 198 views
1

處理模板函數的簡單示例。代碼編譯並按預期工作。但我的問題是爲什麼在「Cmp」和「Lit」中都需要「靜態」?否則,它不會編譯?模板函數採用模板參數

非常感謝!

template<class T> class Cmp{ 
public: 
    static int work(T a, T b) { 
     std::cout << "Cmp\n"; 
     return 0; 
    } 
}; 

template<class T> class Lit{ 
public: 
    static int work(T a, T b){ 
     std::cout << "Lit\n" ; 
     return 0; 
    } 
}; 

template<class T, class C> 
int compare(const T &a, const T &b){ 
    return C::work(a, b); 
} 


void test9(){ 
    compare<double, Cmp<double> >(10.1, 20.2); 
    compare<char, Lit<char> >('a','b'); 
} 
+0

請注意,整個事情可以表達沒有任何類,只需要功能和功能模板。 –

回答

1

static這裏需要的原因是,在compare模板函數,你有這樣一行:

return C::work(a, b); 

語法C::work(a, b)這裏的意思是「調用嵌套類C內部功能work。通常情況下,這會嘗試在不提供接收器對象的情況下調用成員函數。也就是說,通常您稱爲函數work的方式將通過編寫

C myCObject; 
myCObject.work(a, b); 

在這種情況下,我們不想調用成員函數。相反,我們希望函數work與常規函數類似,因爲我們可以在任何時候調用它,而不必相對於其他對象進行操作。因此,我們將這些函數標記爲static,以便它們可以像常規函數一樣調用。

希望這會有所幫助!

3

C::work(a, b)命名爲C的靜態成員函數work()