为什么在Visual Studio 2008/2010中不需要typename __
Why is typename _not_ needed here in Visual Studio 2008/2010?
在这个问题中,提问者有以下功能:
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下编译,需要typename
。即便如此,它在Visual Studio 2008和2010下仍然可以很好地编译。
这只是另一个我不知道的Visual Studio扩展/bug吗?
或者实际上有可能推断出iterator_category
是一个类型或一个函数,因为它后面跟着一对括号()
?(看@DeadGM的消息从这里开始。)这可能是GCC中的一个bug吗?
众所周知,Visual c++不(完全)支持两阶段查找,这是首先需要typename
的根本原因。如果编译器不完全支持这一点,它可能在实例化模板之前无法完全解析模板,此时它"知道"std::iterator_traits<ITER>::iterator_category
是一个类型。显然,这种缺陷也延伸到VC10。
说到typename
,我更相信GCC而不是VC。
MSVC不实现后解析方案吗?在这种方案中,编译器不依赖于typename
。它只是将所有标记存储在模板定义的大括号之间,当模板实例化时,它解析这些标记。因为它知道什么是类型,什么不是类型,所以没有typename
也可以工作。
但是,如果编译器在实例化模板时没有诊断缺失的typename
,那么它是不符合的。
或者实际上有可能推断出iterator_category是类型还是函数,因为它后面跟着一对括号()?
重要的是名称是否依赖和限定。模板本身是否能够推断出名称总是一个类型并不重要。但是,缺少typename
s可能会影响错误消息的质量。
顺便说一句,不,在语言层面上推断iterator_category
是不可能的。
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 为什么返回类型中需要typename?C++
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 为什么在以下情况下不需要为依赖类型使用typename
- 为什么在VS2015中模板相关的嵌套类型名称中不需要typename关键字?
- 为什么嵌套类型的基类不需要"typename"?
- 在不需要时使用"template"和"typename"消除歧义器
- 为什么在Visual Studio 2008/2010中不需要typename __