在我對模板的實驗中,我遇到了一個令人困惑的困境。我正在定義一個默認參數爲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>() {}
但它沒有幫助。我究竟做錯了什麼?
這與函數參數的默認參數一致。 – pmr
@pmr:D – mfontanini
但是......默認參數確實出現在定義中,即「F」。更不用說功能默認參數的規則比模板默認參數更爲寬鬆。 –