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的任何内容发生了变化,我们会很高兴知道。谢谢。
答案 0 :(得分:3)
MSVC 不符合,该代码段不正确;我们必须明确写typename T::iterator
来引用iterator
内的类型名称T
,因为它是依赖类型。
这是编译器中的已知错误,请参阅相关错误报告:
14.6.2.2p1
依赖类型[temp.dep.type]
如果类型是
,则类型是依赖的
模板参数
带有嵌套名称说明符的 qualified-id ,其中包含命名依赖类型的类名或其 unqualified-id 命名依赖类型
...
14.6.2.4p1
依赖模板参数[temp.dep.temp]
类型 template-argument 取决于它指定的类型是否依赖。