2
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 有任何变化,我很高兴知道。谢谢你。

4

1 回答 1

3

MSVC不符合,片段格式错误;我们必须明确地写来引用里面 typename T::iterator的类型名,因为它是一个从属类型iteratorT

这是编译器中的一个已知错误,请参阅相关错误报告:


标准是怎么说的?( 14882-2003 )

14.6.2.2p1 依赖类型 [temp.dep.type]

一个类型是依赖的,如果它是

  • 模板参数,

  • 具有嵌套名称说明符的限定 ID,其中包含命名依赖类型的类名或其非限定 ID命名依赖类型,

  • ...

14.6.2.4p1 依赖模板参数 [temp.dep.temp]

如果它指定的类型是依赖的,则类型模板参数是依赖的。

于 2014-06-11T09:23:35.980 回答