c++ 为什么在将迭代器“(vector < int>a).开始()”传递给参数“vector< T>::iterator b”时无法推断“T”的类型?[重复]

zpqajqem  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(121)

此问题在此处已有答案

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?

a7qyws3x

a7qyws3x1#

迭代器是类模板的嵌套类型,而不是类模板本身。对于T != U来说,没有什么可以阻止std::vector<T>::iteratorstd::vector<U>::iterator是相同的类型。
举个简单的例子:

template<typename T>
struct A
{
    using iterator = int*;
};

template<typename T>
void test(typename A<T>::iterator i) {}

int main()
{
    int* it = nullptr;
    test(it);
}

字符串
在这个例子中,T不能被推导出来是很明显的吗?对于std::vector<T>::iterator来说没有什么不同。

lf3rwulv

lf3rwulv2#

在std::vector:Iterator中有两种实现这种迭代器的方法:

class vector
{
public:
    class iterator
    {
       // Impl
    };
    // Impl
};

字符串
Iterator out of class:

class iterator_impl
{
// Impl
};
class vector
{
public:
    using iterator = iterator_impl;
    // Impl
};


对于第二种实现vector的方式,使用的类型是iterator_impl,并且与std::vector没有任何链接。

相关问题