【发布时间】: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