为什么在Visual Studio 2008/2010中这里不需要类型名_not_?

| 在此问题中,提问者具有以下功能:
template<typename ITER>
bool nextPermutation(ITER start, ITER end)
{
    return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category());
}
为什么在
std::iterator_traits
之前不​​需要
typename
?我认为模板的嵌套类型需要它,如果模板依赖于模板参数本身? GCC似乎支持我的想法,因为它在4.3.4和4.5.1中均未编译,要求ѭ1。即使这样,它在Visual Studio 2008和2010下仍然可以正常编译。 这只是我不知道的另一个Visual Studio扩展/错误吗? 还是实际上可以推断出
iterator_category
是类型还是函数,因为它后面是一对括号
()
? (请参阅从此处开始的@DeadGM \消息。)那么,这实际上可能是GCC中的错误吗?     
已邀请:
MSVC是否不实施后期解析方案?在这种方案中,编译器不依赖于
typename
。它只是将所有令牌存储在模板定义的花括号之间,并且在实例化模板时,它将解析这些令牌。因为它知道类型是什么,什么不是类型,所以它不需要
typename
就可以工作。 但是,如果在实例化模板时编译器没有诊断出丢失的
typename
,则说明它不符合要求。   还是实际上可以推断出iterator_category是类型还是函数,因为它后面是一对括号()? 重要的是名称是否是依赖的和合格的。模板是否可以推断出名称始终是类型并不重要。但是对于丢失messages1的错误消息的质量可能很重要。 FWIW,不,不可能在语言层面上推论出
iterator_category
。     
众所周知,Visual C ++不(完全)支持两阶段查找,这就是为什么首先需要
typename
的根本原因。如果编译器不完全支持此功能,则在实例化模板之前可能无法完全解析模板,此时“知道”ѭ12\是一种类型。显然,这种缺陷扩展到了VC10。 说到“ 1”,我有一天会相信VC会超过GCC。     

要回复问题请先登录注册