C++模板中使用STL迭代器的问题:vector<T>::iterator声明报错的原因及解决方法
#include<iostream>
#include<vector>
#include<iterator>
using namespace std;

template<class T>
void test_iter(const vector<T>);

int main()
{
    vector<string> vec_str{ "Anthony","Chou","Jay","Hahaha" };
    test_iter(vec_str);

    system("pause");
    return 0;
}

template<class T>
void test_iter(const vector<T> vec)
{
    typename vector<T>::iterator iter;
    for (iter = vec.begin(); iter != vec.end(); iter++)
    {
        cout << *iter << endl;
    }
}

上述代码报错,原因是我使用的:

 vector<T>::iterator iter;

vs2017中错误显示如下:

 错误 C2679   二进制“=”: 没有找到接受“std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>”类型的右操作数的运算符(或没有可接受的转换)
错误  C2679   二进制“<<”: 没有找到接受“std::basic_string<char,std::char_traits<char>,std::allocator<char>>”类型的右操作数的运算符(或没有可接受的转换)

我试过不使用泛型而使用:

vector<int>::iterator iter;

来声明具体类型的迭代器就没有问题。
求大神解答,多谢。

0

2个回答

纠正:用string类型实例化test_iter :
test_iter< string >test1;
test1(vec_str);
》》
你把test_iter设计为函数模板?
试试在main函数调用的时候,先用一种类型实例化模板,,再调用:

test_iter test1;
test1(vec_str);

1
sinat_40721384
-iostream- 我自己已经解决了,虽然不是你说的这个原因,还是感谢。原因有两个:一个是我忘记包含string头文件(这个不是关键),二是声明iteraor时应该用vector<T>::const_iterator
一年多之前 回复
sinat_40721384
-iostream- 首先,函数模板好像不能这样实例化。另外,我用template void test_iter<string>(const vector<string>);进行实例化之后,情况并没有发生变化。
一年多之前 回复
sinat_40721384
-iostream- 首先,函数模板好像不能这样实例化。另外,我用:
一年多之前 回复

你把test_iter设计为函数模板?
试试在main函数调用的时候,先用一种类型实例化模板,,再调用:

test_iter test1;
test1(vec_str);

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++ STL 迭代器失效问题
之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase     最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 int arr[]={0,1,2,3,4,5,6,7,8,9,10};   vectorint> a(arr,arr+s
C++标准模板库(STL)迭代器的原理与实现
迭代器(iterator)是一种抽象的设计理念,本文探讨了迭代器的作用与原理,实现了简单的迭代器,并采用trait编程技巧编写了简单算法验证。
使用stl中的 advance和 distance 方法来进行iterator的加减
使用stl中的  advance和 distance 方法来进行iterator的加减            以前在遍历vector的时候,经常使用iterator之间的加减来获得元素在容器里面的index。          今天在进行list的 iterator加减的时候,发现不能编译通过,后面想起list是非线性的容器,不能加减。          查了一下资料,发现s
C++标准模板库 迭代器 iterator 详解(一)
[cpp] view plaincopyprint? #include    #include    #include    #include    #include  //copy   using namespace std;      template class T>   inline void print (const T& coll, con
在用vector 迭代器遇到“vector iterator not incrementable”错误解决办法
1.使用vector的迭代器erase元素的时候,应该注意迭代器越界的问题,eg:   for ( auto it = vec.begin();  it != vec.end();  ++it ){ if ( *it == 2 )  vec.erase(it); } 这样操作会报错“vector iterator not incrementable”; 原因:在执行完era
STL源码学习系列四: 迭代器(Iterator)
迭代器(Iterator) 前言 在STL的思想中,容器和算法是彼此独立设计的,再通过某种方式使它们连接;而迭代器是使算法独立于使用的容器类型,即迭代器是连接算法和容器的方法。由于迭代器是一种行为类似指针的对象,也就说迭代器是一种广义指针,即迭代器对解除引用操作(operator*)和访问成员操作(operator-&amp;amp;gt;)进行重载。然而要对这两个操作符进行重载,对容器内部对象的数据...
c++中iterator迭代器和vector容器
好文章转载分享!本文转自http://blog.csdn.net/nancy_m/article/details/8073013  vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库负责管理存储元素的相关内存。我们把vector称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。
C++标准模板库 迭代器 iterator 详解(二)
迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值。例如,一个数组索引,也可以认为是一种迭代器。 迭代器有各种不同的创建方法。程序可能把迭代器作为一个变量创建。一个STL容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取
容器vector和迭代器iterator的学习使用
vector、algorithm、deque、functional、iterrator、list、map、memory、numeric、queue、set、stack、utility vector的声明: vector vec;size();resize();at();front();back();begin();end();rbegin();rend();empty();assi
vector在多线程下的问题,迭代器失效造成程序崩溃。
最近在做项目的过程中,遇到STL中vector的多线程访问问题。问题大概是这样的:有一个全局的vector,一个写进程对该vector进行插入操作(push_back()),同时有一个读进程在监视该vector的内容并对其进行显示(操作:size(), at(i)),没有进行任何的线程同步,程序的编译没有任何问题,却一直出现运行时错误,主要是数组越界。 当时的考虑时:虽然vector不支持多线程,...
C++ Vector swap操作前后迭代器为何不失效
1 swap操作 swap是STL泛型操作的一种。这种操作的时间复杂度极低,用于两个容器内容的交换。 例如定义vector vi1和vi2, vi1.swap(vi2),就将vi1和vi2的内容交换了。 2  问题 iterator实际上是一种指针,可以指向容器的任意位置。例如vector::iterator it1 = vi1.begin(); 这两个操作本
Vector容器与iterator迭代器
Vector容器与iterator迭代器 首先,回顾一下"::"的用法: ::是运算符中等级最高的,它分为三种: 1)global scope(全局作用域符),用法(::name) 2)class scope(类作用域符),用法(class::name) 3)namespace scope(命名空间作用域符),用法(namespace::name) 他们都是左关联(left-a
c++ STL中容器迭代器失效
参考:http://www.cnblogs.com/yuanshuang/p/5777905.html http://blog.csdn.net/aa838260772/article/details/39678187 序列性容器::(vector和list和deque)          erase迭代器不仅使所指向被删元素的迭代器失效,而且使被删元素之后的所有迭代器失效,
C++容器vector和迭代器iterator
vector是同一种对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的类存。引入头文件#include&amp;lt;vector&amp;gt;1.vector对象的定义和初始化[cpp] view plain copyvector&amp;lt;T&amp;gt; v1             vector保存类型为T的对象。默认构造函数,v1为空  vector&amp;lt;T...
vector对象的定义和初始化以及vector迭代器iterator
vector对象的定义和初始化 vector类定义了好几种构造函数,用来定义和初始化vector对象。 vectorT> v1; vector保存类型为T的对象。默认构造函数v1为空。 vectorT>v2(v1); v2是v1的一个副本。 vectorT>v3(n,i); v3包含n个值为i的元素。
STL-迭代器源码剖析
在接触了STL后,觉得STL就是一个为效率而生的怪物,而且令人惊讶的是它里面的很多算法和模板对于学C++的人来说是非常有价值去剖析的。        迭代器(Iterator)模式--提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。 STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂(iterator)将它们撮合在一
如何获取vector的一个迭代器iterator的地址
在使用vector时,使用*iterator可以读出迭代器指向vector中的值,那如果想读出iterator的地址,该怎么表示呢? 思考 对于常规的指针而言,可以用int *ptr来表示一个指向整型变量的指针,*ptr即指向整型变量的值,ptr即地址 代码如下 #include &amp;lt;iostream&amp;gt; using namespace std; int main(){ int i =...
C++学习笔记——并不是所有迭代器都有加减法
能进行算术运算的迭代器只有随即访问迭代器,要求容器元素存储在连续内存空间里,vector,string,deque的迭代器是有加减法的,但是map,set,multimap,multiset的迭代器是没有加减法的,list也不可以 该知识点是在刷leetcode347题时想到的 Given a non-empty array of integers, return the k most fre
STL — STL迭代器的原理以及迭代器失效
STL迭代器                                                                                                                     作为STL六大组件之一Iterator(迭代器)模式又称Cursor(游标)模式,用于提供一种方法顺序访问一个聚合对象中各个元
STL学习笔记--3、迭代器iterator与traits编程
iterator iterator_traits __type_traits
C++ STL 迭代器方法 之 advance与prev 方法 浅析
迭代器是STL中重要的一支,近来有幸用到到的两个方法,prev和distance。distance方法十分简单,就不在此赘述,现主要对prev方法以及其相关方法,advance方法作简要介绍与使用说明,并在文末附上代码示例。
使用迭代器的错误之一:对迭代器越界值解引用,而且这种情况是发生在判断条件中,比较隐蔽
问题代码#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; void prin_vec (ostream& Out,vector<string>& word_list) { vector<string>::const_iterator i,j;
STL-(set,string,map,vector,各迭代器的用法)
这个太多了,推荐几篇博客。 各迭代器的用法参见:https://www.cnblogs.com/lhuan/p/5706654.html set常见函数参见:https://blog.csdn.net/ac_hexin/article/details/52042562 string的用法及例子参见:https://blog.csdn.net/tengfei461807914/article/...
C++中利用迭代器删除元素
C++中利用迭代器删除元素会发生什么 (1)对于关联容器(如map,set,multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前的iterator即可。这是因为map之类的容器,使用了红黑树来实现,插入,删除一个结点不会对其他结点造成影响。使用方式如下例子:
【C++ STL系列】迭代器 iterator
c++ iterator1、 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型。(1)每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter;这条语句定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。(2) 使用迭代器读取vector中的每一个元素:vector<int> ivec(10,1);
VS2015 STL中迭代器能否赋值NULL,迭代器能否与NULL做比较
VS2015中,STL中的迭代器能否赋值为NULL,迭代器能否与NULL做比较,迭代器如何初始化和做空值处理
C++定义map类型的模板迭代器
C++定义map类型的模板迭代器 template &amp;lt;typename K, typename V&amp;gt; using MapIterator_T = typename std::map&amp;lt;K, V&amp;gt;::iterator; 使用下面这种形式会报错 template &amp;lt;typename K, typename V&amp;gt; typename std::map&amp;lt;K,...
Qt的两种迭代器(Java和STL)
两个不同风格的迭代器最基本的的区别是: Java迭代器存在的位置在数据前或数据后,通过next()来读取数据。 STL迭代器类似指针,指向数据,使用一元操作符*来获取数据。
iterator迭代器和指针的区别
迭代器与指针的差别: 迭代器: (1)迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,*,++ --等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指针,是指针概念的一种提升(lift),提供了比指针更高级的行为,相当于一种智能指针,他可以根据不同类型的数据结构来实现不同的++,--等操作; (2)迭代器返回的是对象引用而不是对象的值,所以c
一文读懂迭代器(iterator)在vector中的用法
首先写好头文件vector和string的头文件是 #include #include 知识点:vec_str.begin() 得到的就是迭代器的指针 vector::iterator 这个是迭代器的类型 当然这个太难记了可以用auto进行替换代码一就是用的上面的类型下面的是用auto进行替换的 #include #include #include using namespa
实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])
遍历一个vector容器有很多种方法,使用起来也是仁者见仁。通过索引遍历:for (i = 0; i<v.size(); i++) { cout << v[i] << " "; }迭代器遍历:for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++) { cout << *iter << " "; }算法遍历
C++/C++11中头文件iterator的使用
&lt;iterator&gt;是C++标准程序库中的一个头文件,定义了C++ STL标准中的一些迭代器模板类,这些类都是以std::iterator为基类派生出来的。迭代器提供对集合(容器)元素的操作能力。迭代器提供的基本操作就是访问和遍历。迭代器模拟了C++中的指针,可以有++运算,用*(解引用算符,deference)或-&gt;算符来访问容器中的元素。容器中元素如果改变了所用内存,也不影响...
vector迭代器失效的几种情况
在泛型编程还是STL的实际运用中,迭代器(iterator)无疑扮演者重要的角色。迭代器是一种类似于指针的对象(如可以内容提领,成员访问等),但他又不仅仅是一种普通的指针。关于迭代器失效,我们可以看下面这个例子: #include #include void PrintVector(const vector& v) {     vector::const_iterator it =
C++迭代器:const_iterator和const形式的iterator有什么区别?
从C语言走过来的猿们, 对指针已经很熟悉了, 也很清楚指向常量的指针和常指针的区别。 在本文中, 我们来学习一下C++中的迭代器, 顺便类比指针来学习一下指向常量的迭代器和常迭代器的区别。        其实, 迭代器很简单, 你就把它理解为一种类似指针的东西就行了, 毕竟指针的概率是广义的, 你的手指, 大拇指, 小拇指, 那就是个指针。 比如, 完全可以把vector::iterator理解
C++中的vector、list和vector的区别、set的用法与区别以及迭代器iterator
vector封装数组,list封装了链表,map和set封装了二叉树 1.vector 初始化:vector&amp;lt;int&amp;gt; test       vector&amp;lt;int&amp;gt; test(n,0) (n不用初始化,可cin输入或者读入文件) 初始化长度为n,元素值全部为0。 sort: sort(test.begin(),test.end())       //test中的元素按...
实战c++中的vector系列--可怕的迭代器失效(vector重新申请内存)
vector给我们提供了很多的方便,但是偶尔也会有陷阱。当不注意的时候,就掉入其中。说到底,还是对vector的机制不够彻底掌握。很轻松的写下这段代码:#include<iostream> #include<vector> using namespace std; int main() { vector<int> v; v.push_back(1); std::vector<i
C++ STL迭代器与索引相互转换
0 前言 C++ STL提供了vector、list等模板容器,极大地方便了编程使用。 “遍历”是对容器使用的最常用的操作。 使用迭代器来遍历是最好最高效的遍历方法。 当然,对于有些容器的遍历除了使用迭代器,还可以使用传统的索引来遍历。 在实际编程中,需要迭代器和索引同时使用,混合编程,就难免会涉及到迭代器和索引之间的相互转换。 转换主要是使用STL中的advance和distance函数来进行的...
聊聊map和vector的迭代器失效问题(某公司招聘笔试试题)
当删除一个STL容器(比如map, vector)中的某个元素时, 会引起迭代器失效, 所以, 我们务必提高警惕。 某次笔试, 我遇到这样一个题目: 删除map<int, int>中value为5的倍数的元素。 该题看起来很自然很简单, 实则有迭代器失效的陷阱。        如果对迭代器失效问题一无所知, 则很容易写出如下的错误代码: #include #include using namespace std; typede
C++ 迭代器的next和prev
C++ 迭代器的next和prev 迭代器的下一个或上一个分别用next和prev获取 #include &amp;amp;lt;string&amp;amp;gt; #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;iterator&amp;amp;gt; #include &amp;amp;lt;map&amp;amp;gt; using namespace std; int main() map&amp;amp
标准库vector类型和迭代器iterator类型
对C++ Primer 中文版第4版  第三章
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java迭代器学习 学习人工智能的原因