首頁 >後端開發 >C++ >如何正確明確地特化模板類別中的成員函數?

如何正確明確地特化模板類別中的成員函數?

Barbara Streisand
Barbara Streisand原創
2024-12-03 01:33:14107瀏覽

How to Correctly Explicitly Specialize Member Functions in Templated Classes?

類別範本中成員函數的明確特化

使用類別範本時,成員函數的明確特化是一個常見的要求。但是,在類別模板本身成為模板的情況下,可能會因不正確的方法而出現錯誤。

考慮以下場景:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn