【问题标题】:Is it required to qualify a dependent name with typename if it is used as a template argument? [duplicate]如果将依赖名称用作模板参数,是否需要使用 typename 限定依赖名称? [复制]
【发布时间】:2014-06-11 09:09:11
【问题描述】:
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 是否也接受它作为功能模板?我问是因为对于一个函数,可能有多个重载,其中一些具有类型模板参数,而另一些具有非类型模板参数。
  • @Mat:谢谢,已解决
  • @hvd:AFAIK MSCV 从不需要 typename 关键字,因为它并没有真正进行两阶段查找。它在实例化时进行查找
  • 当然,但我问的原因是在类模板中,上下文肯定需要类型名称,因此放宽对 typename 关键字的任何限制不会影响有效代码。对于函数模板,它会影响有效代码。
  • IIRC,MSVC 在所有情况下也不需要.template 消歧

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


【解决方案1】:

MSVC 不符合,sn-p 格式不正确;我们必须显式编写typename T::iterator 来引用T 内的类型名称iterator,因为它是一个依赖类型

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


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

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

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

  • 模板参数,

  • 一个带有 nested-name-specifierqualified-id,其中包含一个 class-names,用于命名依赖类型或其 unqualified-id 命名了一个依​​赖类型,

  • ...

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

一个类型模板参数如果它指定的类型是依赖的,那么它就是依赖的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2018-11-22
    • 2015-01-25
    • 1970-01-01
    • 2012-10-29
    相关资源
    最近更新 更多