将模板类专门化为结构

Chr*_*ica 17 c++ struct class template-specialization

我刚刚专门std::hash针对用户定义的类型使用:

template<>
struct hash<...> {...};
Run Code Online (Sandbox Code Playgroud)

当VC10向我发出警告时:

警告C4099:'std :: hash <_Kty>':使用'struct'时首先看到使用'class'看到的类型名称

我发现它的标准库声明std::hashclass,而标准(或我最新的自由草案)声明为struct.

好吧,当然我知道结构与类没有任何不同(除了不同的默认访问和继承类型).但我的问题是:

  1. VC10是否违反此标准,或者是否可以在任何标准库组件中自由交换structs class(当然,只要成员所需的访问类型保持一致)?
  2. 将模板类专门化为结构是否合法,反之亦然,或者这会带来名称解析等问题(至少VC10认为值得警告).

Die*_*ühl 8

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

在重新声明,部分特化,显式特化或类模板的显式实例化中,类 - 密钥应与原始类模板声明一致.

但是,struct并且class根据7.1.6.3 [dcl.type.elab]第3段最后一句引用相同的类密钥:

精细类型说明符中存在的class-key或enum关键字应与精心设计类型说明符中的名称所引用的声明一致.[...]因此,在任何详细类型说明符中,enum关键字应用于引用枚举,union class-key应用于引用union,以及类或struct class-key应该用于引用使用class或struct class-key声明的类.

试图G ++,铛,以及EDG都同意,有可能专门声明为模板structclass.然而,铛发出警告,从已经改变structclass反之亦然.基于此,标准库可以自由选择它认为适合定义的任何关键字.显然,如果编译器拒绝代码,结果会严重破坏,但我认为这是编译器而不是在这种情况下出错的库.