使用類別範本時,成員函數的明確特化是一個常見的要求。但是,在類別模板本身成為模板的情況下,可能會因不正確的方法而出現錯誤。
考慮以下場景:
template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() { }
此程式碼嘗試明確特化成員double 類型的類別模板 X 的函數。但是,當 X 本身成為模板時,編譯器會報告錯誤:
error: template-id 'get_as<double>' in declaration of primary template error: prototype for 'void X<C>::get_as()' does not match any in class 'X<C>'
解決方案是也明確特化周圍的類別模板。這可以透過向專門的成員定義添加一個空白模板參數來完成:
template <> template <> void X<int>::get_as<double>() { }
這將僅針對 X
或者,可以使用重載以實現所需的行為:
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>) { } };
此方法依賴於模板專門化來選擇適當的get_as()重載,確保按預期應用雙精度類型特化。
以上是如何正確明確地特化模板類別中的成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!