具有明確專業化成員函數的模板類別
為類別模板的成員函數定義明確專業化時,會出現一個常見的陷阱:周圍的類別模板也是一個模板。要理解這個問題,請考慮以下範例:
#include <iostream> #include <cmath> template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() {} // Explicit specialization for double int main() { X<int> x; x.get_as(); }
此程式碼嘗試明確特化 X 類別範本的 double 的 get_as 成員函數。但是,這種方法會導致編譯器錯誤,因為周圍的類別模板未明確特化。
錯誤方法:
嘗試明確特化成員函數而不特化類別模板如下圖所示,是不正確:
template <class C> template<> void X<C>::get_as<double>() {}
正確解決方案:
要解決此問題,類別模板和成員函數都必須明確特化。例如,要將get_as 函數專門用於X
template <> template <class T> void X<int>::get_as() {} template <> void X<int>::get_as<double>() {}
替代選項:
或者,保留周圍的類模板未特化,可以使用get_as 函數的重載,如下所示程式碼:
template <class C> class X { template<typename T> struct type { }; public: template <class T> void get_as() { get_as(type<T>()); } private: template<typename T> void get_as(type<T>) {} void get_as(type<double>) {} };
以上是如何正確顯式地特化類別模板的成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!