如果依赖名称用作模板参数,是否需要用typename限定该名称?
Is it required to qualify a dependent name with typename if it is used as a template argument?
template<class mapT, class K, class V>
void f(mapT& m, const K& k, const V& v)
{
pair<mapT::iterator, bool> p = m.insert(make_pair(k, v));
}
MSVC接受此代码,没有错误或警告。标准对此有什么规定?在上面的例子中,我们是允许(可选),不允许(禁止),还是要求(强制)用typename限定T::iterator ?我对c++ 03的规则特别感兴趣,尽管如果11有任何变化,那将是很高兴知道的。谢谢你。
MSVC不一致,代码段是病态的;我们必须显式地写typename T::iterator
来引用T
内部的类型名称iterator
,因为它是依赖类型。
这是编译器中一个已知的错误,请参阅相关的错误报告:
- [bug报告] MSVC允许在依赖类型名前省略typename关键字
标准怎么说?(14882 - 2003)
14.6.2.2p1
依赖类型[temp.dep.type]
如果是
,则类型是依赖的
模板参数
一个限定id带有嵌套名称说明符的类名命名依赖类型,或者其不限定id命名依赖类型,
…
<一口>一口>
14.6.2.4p1
依赖模板参数[temp.dep.temp]
类型模板参数是依赖的,如果它指定的类型是依赖的。
相关文章:
- 如何将一个使用参数包和typename的类作为函数(c++)的输入参数
- 将TypeName作为参数()作为参数()
- 使用 "typename Container::value_type" 作为返回值时无法推断模板参数
- 为什么可变参数模板在模板介绍中不起作用,但在要求子句中起作用?ConceptName{T,U,V,W} <-- template<typename ...T>
- 模板成员转换运算符,默认模板参数到与 TypeName 绑定的函数
- 模板参数typename和非typename之间的区别
- 如何将"std::array"用于"模板类"形式的模板参数<typename>?
- typename 参数的模板专用化是特定模板的任何实例化
- 缩短C++枚举成员的路径(使用 typedef 或 typename),以用作模板参数
- C++std::bind接受typename作为第一个参数
- 需要帮助来理解具有复杂typename参数的模板函数
- 模板参数列表中的额外 typename 关键字:是否有效
- 为什么在函数参数列表中重复typename关键字是必要的
- 在C++中作为参数传递的Typename
- 作为非typename参数的局部变量
- "typename qualified-id"引用非类型参数声明中的类型
- 模板typename为同一模板的其他参数的类型
- 带有模板参数或typename的模板函数
- 如果依赖名称用作模板参数,是否需要用typename限定该名称?
- 为什么模板模板参数不允许在参数列表后使用"typename"