如果将依赖名称用作模板参数,是否需要使用typename限定它?

时间:2014-06-11 09:09:11

标签: c++ templates language-lawyer c++03 dependent-name

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的任何内容发生了变化,我们会很高兴知道。谢谢。

1 个答案:

答案 0 :(得分:3)

MSVC 不符合,该代码段不正确;我们必须明确写typename T::iterator来引用iterator内的类型名称T,因为它是依赖类型

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


标准说什么? (14882-2003

  

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

     
    

如果类型是

,则类型是依赖的          
        
  • 模板参数

  •     
  • 带有嵌套名称说明符 qualified-id ,其中包含命名依赖类型的类名或其 unqualified-id 命名依赖类型

  •     
  • ...

  •     
  

  

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

     
    

类型 template-argument 取决于它指定的类型是否依赖。