此问题在此处已有答案:
Why does iterator type deduction fail? [duplicate](2个答案)
What is a non-deduced context?(2个答案)
昨天就关门了。
有以下代码:
template<typename T>
void test(const typename std::vector<T>::iterator &i){
}
int main(int argc, char **argv)
{
std::vector<int> a;
test(a.begin());
}
字符串
编译时会提示错误,无法推断出'test(a.开始())'行的'T'型别。看起来应该是很容易的推断。是否有任何特殊原因导致编译器无法正确地推断出它?
C++标准:14
编译器:Apple clang 15.0.0版
在使用gcc时也会出现同样的问题。在gcc中,std::vector::iterator实际上对应于__gnu_cxx::__normal_iterator<pointer,vector>类型,其中pointer是_Vector_base<T,std::allocator>::指针类型,vector代表std::vector<T,std::因此,扩展与std::vector::iterator相关联的类型会导致__gnu_cxx::__normal_iterator<_Vector_base<T,std::allocator>::pointer,std::vector<T,std::我很难理解为什么传递的参数类型是__gnu_cxx::__normal_iterator<_Vector_base<int,std::分配器>::指针,std::向量<int,std::分配器>>,函数参数类型为__gnu_cxx::如果函数中包含一个指针,则函数中包含一个向量,而函数中包含一个指针。
正确答案:What is a non-deduced context?
2条答案
按热度按时间a7qyws3x1#
迭代器是类模板的嵌套类型,而不是类模板本身。对于
T != U
来说,没有什么可以阻止std::vector<T>::iterator
和std::vector<U>::iterator
是相同的类型。举个简单的例子:
字符串
在这个例子中,
T
不能被推导出来是很明显的吗?对于std::vector<T>::iterator
来说没有什么不同。lf3rwulv2#
在std::vector:Iterator中有两种实现这种迭代器的方法:
字符串
Iterator out of class:
型
对于第二种实现vector的方式,使用的类型是iterator_impl,并且与std::vector没有任何链接。