C++ 如果将依赖名用作模板参数,是否需要使用typename限定该依赖名? 模板 无效f(地图测绘、常数K&K、常数V&V) { 对p=m.插入(形成对(k,v)); }

C++ 如果将依赖名用作模板参数,是否需要使用typename限定该依赖名? 模板 无效f(地图测绘、常数K&K、常数V&V) { 对p=m.插入(形成对(k,v)); },c++,templates,language-lawyer,c++03,dependent-name,C++,Templates,Language Lawyer,C++03,Dependent Name,MSVC接受此代码,没有错误或警告。标准对此有何规定?在上面的示例中,我们是否允许(可选)、不允许(禁止)或必须(强制)使用typename限定T::iterator?我对C++03规则特别感兴趣,尽管如果11有什么变化,我很高兴知道。谢谢。MSVC不一致,代码片段格式不正确;我们必须显式地编写typename T::iterator来引用T中的类型名iterator,因为它是一个依赖类型 这是编译器中的已知错误,请参阅相关错误报告: 标准怎么说?() 14.6.2.2p1依赖类型[te

MSVC接受此代码,没有错误或警告。标准对此有何规定?在上面的示例中,我们是否允许(可选)、不允许(禁止)或必须(强制)使用typename限定T::iterator?我对C++03规则特别感兴趣,尽管如果11有什么变化,我很高兴知道。谢谢。

MSVC不一致,代码片段格式不正确;我们必须显式地编写
typename T::iterator
来引用
T
中的类型名
iterator
,因为它是一个依赖类型

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


标准怎么说?()
14.6.2.2p1
依赖类型
[temp.dep.type]

如果类型是依赖的,则它是依赖的

  • 模板参数

  • 带有嵌套名称说明符的限定id,该说明符包含命名依赖类型的类名或其非限定id命名依赖类型的类名

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

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


MSVC是否也接受它作为函数模板?我之所以这样做是因为对于一个函数,可能存在多个重载,其中一些重载具有类型模板参数,而另一些重载具有非类型模板参数。@Mat:谢谢,修复了that@hvd:AFAIK MSCV从不需要typename关键字,因为它实际上不进行两阶段查找。它在实例化时进行查找,但我问的原因是,在类模板中,上下文肯定需要类型名,因此放松对
typename
关键字的任何限制都不会影响有效代码。对于函数模板,它可能会影响有效的代码。IIRC,MSVC也不需要在所有情况下消除
.template
歧义
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));
}