簡體   English   中英

將模板類專門化為結構

[英]Specializing a template class as a struct

我剛剛使用以下方法專門為用戶定義的類型專門化std::hash

template<>
struct hash<...> {...};

當VC10向我發出警告時:

警告C4099:'std :: hash <_Kty>':使用'struct'時首先看到使用'class'看到的類型名稱

我發現它的標准庫將std::hash聲明為class ,而標准(或我最新的自由草案)將其聲明為struct

好吧,當然我知道結構與類沒有任何不同(除了不同的默認訪問和繼承類型)。 但我的問題是:

  1. VC10是否違反了此標准,或者是否可以在任何標准庫組件中為class s交換struct (當然,只要成員所需的訪問類型保持一致)?
  2. 將模板類專門化為結構是否合法,反之亦然,或者這會帶來名稱解析等問題(至少VC10認為值得警告)。

首先,這是從14.5.1 [temp.class]第4段中得到的答案:

在重新聲明,部分特化,顯式特化或類模板的顯式實例化中,類 - 密鑰應與原始類模板聲明一致。

但是,根據7.1.6.3 [dcl.type.elab]第3段最后一句, structclass引用相同的類 - 鍵:

精細類型說明符中存在的class-key或enum關鍵字應與精心設計類型說明符中的名稱所引用的聲明一致。 [...]因此,在任何詳細類型說明符中,enum關鍵字應用於引用枚舉,union class-key應用於引用union,以及類或struct class-key應該用於引用使用class或struct class-key聲明的類。

嘗試g ++,clang和EDG都同意可以將聲明為struct的模板專門化為class 然而,clang警告說從struct改為class ,反之亦然。 基於此,標准庫可以自由選擇它認為適合定義的任何關鍵字。 顯然,如果編譯器拒絕代碼,結果會嚴重破壞,但我認為這是編譯器而不是在這種情況下出錯的庫。

1:我不確定,但我相信這是一個錯誤。

對於2:不要擔心,它不應該導致任何奇怪的行為。 請注意您定義的函數范圍。 至於警告, 它實際上非常普遍 (即不是特別針對模板),所以我不會太在意它。

編輯:另請參閱這個問題的答案,它基本上說它在標准上沒有任何區別,但是有些編譯器可能表現得很奇怪。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM