2012-10-20 100 views
2

在我對模板的實驗中,我遇到了一個令人困惑的困境。我正在定義一個默認參數爲int的模板結構F。它具有模板成員函數g。我在結構定義下面定義它。我認爲這是正確的方式,但是,我收到一個錯誤。而且,只有一個錯誤:模板類具有模板成員函數遇到問題

prog.cpp:9:62: error: default argument for template parameter for class enclosing 'void F< >::g()'

template <typename = int> struct F { 

    template <typename> void g(); 

}; 

template <typename T = int> template <typename> void F<T>::g() {} 

int main() { 

    F<>f; 

} 

這是相當模糊的。我無法準確理解它的含義。所以我試着改變一些東西。我認爲這是F定義的默認模板參數。因此,我改變:

template <typename = int> struct F { 

template <typename T = int> struct F { 

我也試過給g模板參數:

template <typename T = int> template <typename U> void F<T>::g<U>() {} 

但後來我收到的錯誤:

prog.cpp:9:67: error: function template partial specialization 'g' is not allowed
prog.cpp:9:67: error: default argument for template parameter for class enclosing 'void F::g()'

我甚至試過了ying g是模板功能:

template <typename T = int> template <typename U> void F<T>::template g<U>() {} 

但它沒有幫助。我究竟做錯了什麼?

回答

7

默認模板參數必須只在函數的聲明中使用,而不是定義:

template <typename T/* = int*/> template <typename> void F<T>::g() {} 
+0

這與函數參數的默認參數一致。 – pmr

+0

@pmr:D – mfontanini

+0

但是......默認參數確實出現在定義中,即「F」。更不用說功能默認參數的規則比模板默認參數更爲寬鬆。 –