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;

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

2个回答

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

test_iter test1;
test1(vec_str);

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);

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++模板中使用STL迭代器的问题:vector::iterator声明报错的原因及解决方法
#includern #includern #includern using namespace std;rnrn templatern void test_iter(const vector);rnrn int main()rn rn vector vec_str "Anthony","Chou","Jay","Hahaha" ;rn test_iter(vec_str);rn rn system("pause");rn return 0;rn rnrn templatern void test_iter(const vector vec)rn rn typename vector::iterator iter;rn for (iter = vec.begin(); iter != vec.end(); iter++)rn rn cout << *iter << endl;rn rn rn rn上述代码报错,原因是我使用的:rnrn vector::iterator iter;rn rnvs2017中错误显示如下:rnrn 错误 C2679 二进制“=”: 没有找到接受“std::_Vector_const_iterator>>”类型的右操作数的运算符(或没有可接受的转换)rn 错误 C2679 二进制“<<”: 没有找到接受“std::basic_string,std::allocator>”类型的右操作数的运算符(或没有可接受的转换)rn rn我试过不使用泛型而使用:rnrn vector::iterator iter;rn rn来声明具体类型的迭代器就没有问题。rn求大神解答,多谢。
STL iterator迭代器的使用
...今天没力气跑步了.撸个代码压压惊. 以下是对f_zyj大佬模板中提供的iterator迭代器相关知识的测试和注解 f_zyj大佬的博客: http://blog.csdn.net/f_zyj/article/details/51594851 地址为pdf中第20页#define pause system("pause"); #define fence puts
vector iterator not dereferencable迭代器报错
输入数字到容器内,计算相邻两值的和,然后输出,区分奇偶数情况,为什么运行会报错?vector iterator not dereferencable。rn求聚聚帮忙!rnrn#includern#includernusing std::vector;rnint main()rnrn vector x;rn int n;rn while (std::cin >> n)rn rn x.push_back(n);rn rn vector::iterator it = x.begin();rn if (x.end() - it < 2)rn rn std::cout << *it << " ";rn rn elsern rn if ((x.end() - it) % 2 == 0)rn rn for (it; it != x.end() - 1; it += 2)rn rn std::cout << *it + *(it + 1) << " ";rn rn rn elsern rn for (it; it != x.end() - 2; it += 2)rn rn std::cout << *it + *(it + 1) << " ";rn rn std::cout << *(x.end() - 1);rn rn rn
vector容器与iterator迭代器
vector容器与iterator迭代器,有两者的区别和联系,供大家学习理解
STL 中 链表(双向链表)和迭代器(iterator)的使用
//STL 中 链表(双向链表)和迭代器的使用 ,,迭代器就理解成指向元素的指针 #include #include using namespace std; void ListUsage() { list l; for(int i=0;i<5;i++) { l.push_back(i+1); //压入元素 } cout << "Elements in l
STL源码剖析之迭代器Iterator
在设计模式中,迭代器的定义如下:提供一种方法能够依次访问聚合元素而又无需暴露内部的表达方式。由于STL标准库中的设计将容器与算法相互分隔开,迭代器扮演之间的粘合剂。 一、设计原理 STL中迭代器为智能指针(smart pointer),指针具有的行为有->和*,因此迭代器会重载operator->和operator*。STL中有个auto_ptr原生指针可供参考学习。 二、auto_ptr
C++ STL的迭代器(iterator)
// since C++11 #include <iostream> #include <vector> #include <iterator>int main() { std::vector< int > v = { 3, 1, 4 }; // such assignment is supported since C++11 auto vi = std::begin( v );
C++中的迭代器(STL迭代器)iterator
1.Cpp中的迭代器 要访问顺序容器和关联容器中的元素,需要通过迭代器(iterator)进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素,从这一点上看,迭代器和指针类似。 迭代器按照定义方式分成以下四种: 正向迭代器,定义方法如下: 容器类名::iterator 迭代器名; 常量正向迭代器,定义方法如下:...
STL迭代器(iterator)
迭代器定义 迭代器(iterator):扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。共有5种类型 迭代器模式:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式。 STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂(iterator)将它们撮合在一起。 STL的迭代器是一个可遍历STL容器全部或者部分数据。
STL::iterator迭代器
迭代器是一种泛化的指针。 iterator遵循的原则: 因为迭代器是算法连接容器的桥梁,算法通过迭代器操作容器实现算法的目标。所以算法有时需要去了解迭代器的特征(trait)来更好的使用迭代器。 不同容器的迭代器都需要声明5个特征供算法查询: _List_iterator内的5个 特征声明: 算法内获取迭代器特征的方法: 当迭代器I是一个class时可以直接获取 萃取机 traits: 问题...
【STL】迭代器iterator和有关问题
迭代器的基本操作(即每种容器的迭代器都有的操作):  自增++  自减--  去引用*
STL 模板库中迭代器 iterator 失效问题
在做线上测试是涉及到vector 的相关迭代器操作,引出迭代器失效问题,这里mark一下。 如下程序是运行不起来的: #include using namespace std; #include int main(int argc,char *argv[]) { vector vs_int; vs_int.push_back(0); vector:: iterator iter = vs
iterator在vector中的使用
iterator在vector中的使用 iterator也被称为迭代器,可以指向一个范围内(如queue、vector、set等等)的元素,与指针类似。迭代器分为五个不同的类别,输入、输出、向前、双向、随机访问。 在vector中的迭代器属于随机访问迭代器。 使用时需要注意,一个长度为5的vector对象,它的end指向的元素相当于字符串中的‘\0’,是一个无效的元素,需要进行-1操作,才是真实的...
c++ vector iterator 向量迭代器
程序能正确运行,但运行完后会弹出这个提示“Debug Assertion Failed”“Expression :vector iterators incompatible”一般出现这种情况是什么原因?求指教啊
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...
C++:标准程序库-STL迭代器Iterator
http://blog.csdn.net/pipisorry/article/details/71156760暂时保存一下对templete类型迭代时报错c++vector:iterator it出错error: need ‘typename’ before ‘std::set::iterator’ because ‘std::set’ is a dependent scope也就是在set::i
【STL】反向迭代器(Reverse Iterator)
1. 定义 反向迭代器(Reverse Iterator)是一种反向遍历容器的迭代器。也就是,从最后一个元素到第一个元素遍历容器。反向迭代器将自增(和自减)的含义反过来了:对于反向迭代器,++运算将访问前一个元素,而–运算则访问下一个元素。 2. 作用 (1)反向迭代器需要使用自减操作符:标准容器上的迭代器(reverse_iterator)既支持自增运算,也支持自减运算。但是,流迭代器由于不能反向
STL六大组件之迭代器iterator
STL是Standard Template Library的简称,中文名标准模板库,是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室开发的 ,是一个具有工业强度的,高效的C++库,STL早已是ANSI/ISO C++标准中的一部分。STL库由于其对跨平台,对标准C++的支持,开源,高效等优点,如今已经被广泛运用于企业级开发。
一文读懂迭代器(iterator)在vector中的用法
首先写好头文件vector和string的头文件是 #include #include 知识点:vec_str.begin() 得到的就是迭代器的指针 vector::iterator 这个是迭代器的类型 当然这个太难记了可以用auto进行替换代码一就是用的上面的类型下面的是用auto进行替换的 #include #include #include using namespa
Vector中迭代器的使用
vector&amp;lt;int&amp;gt;::iterator v = vec.begin(); while( v != vec.end()) { cout &amp;lt;&amp;lt; &quot;value of v = &quot; &amp;lt;&amp;lt; *v &amp;lt;&amp;lt; endl; v++; }
Iterator设计模式,探究STL中迭代器的实现原理
官方定义: Iterator模式是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。 《STL源码剖析》中关于迭代器Iterator的描述: STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,彼此独立设计,最后再用迭代器(Iterator)把他们粘合在一起。可见迭代器
一篇文章搞懂STL中的迭代器Iterator
Table of Contents 0.概述 迭代器是一种智能指针 迭代器是一种连接容器和算法的桥梁 1.迭代器的分类 Input(输入)迭代器 Output(输出)迭代器 Forward(前向)迭代器 Bidirectional(双向)迭代器 Random Access(随机存取)迭代器 迭代器相关算法函数 各个容器支持的迭代器 2.迭代器的失效 ...
STL模板之vector与sort的使用
STL模板之vector与sort的使用@(算法学习)题目描述 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩.都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter
【C++ STL 温故而知新 001】vector容器和iterator迭代器
一、vector容器 二、iterator迭代器 三、C++中用new和不用new创建对象区别
java中的Iterator迭代器的使用
ort java.util.*; import java.util.HashSet;public class CllectionEach { public static void main(String[] args) { Collection books = new HashSet(); books.add("guodongTest");
Java中迭代器的使用(Iterator)
package collection02;import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set;public class TestIterator {
迭代器iterator在opencv中使用
迭代器iterator可以很方便的遍历所有元素。Mat类支持迭代器的方式对矩阵元素进行遍历。由于使用迭代器就不需要再使用行列数进行操作。
Scala中迭代器Iterator使用
Iterator用完即丢,只有那些状态有关的方法才不会导致数据变少。 It is of particular importance to note that, unless stated otherwise, one should never use an iterator after calling a method on it.  length: Int
STL中的iterator配合Vector怎么用??
RT.请各位给点示例代码。
C++ STL笔记,迭代器,vector
STL 中定义了5种迭代器:输入,输出,向前,双向,随机访问,所有迭代器都具备操作符==,!=,和解引用操作符*。 算法reverse:将线性表的y元素逆置。 reverse ( y.begin( ),y.end( ) ); 算法accumulate:对线性表的y元素求和。 int sum = accumulate( y.begin ( ),y.end ( ),0 );
Iterator迭代器的使用
迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 Java中的Iterator功能比较简单,并且只能单向移动:   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
迭代器的使用iterator
迭代器的使用iterator 有用的请点个赞或者留个言,没用的也不要踩啊,谢谢!!!迭代器的使用iteratorimport java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List;public class DemoTest { public
Iterator(迭代器)的使用
最近使用Hibernate,在多对一映射中需要用到Set 对象,为了把对象中的数据输出,用到了Iterator对象。 Iterator是一个轻量级(创建代价很小)对象,它可以遍历序列中数据,无需知道其序列底层结构。 一、Iterator对象的创建 (   Set products; ...... ) Iterator it=products.iterator(); 二、遍历
java Iterator迭代器的使用
java Iterator迭代器的使用 java Iterator迭代器的使用 java Iterator迭代器的使用
Iterator迭代器的使用(自用)
Iterator&amp;lt;Entry&amp;lt;String,String&amp;gt;&amp;gt; iter=map.entrySet().iterator(); /获得map的迭代器,用作遍历map中的每一个键值对 Iterator是迭代器,map之前应该定义过,姑且认为是HashMap。&amp;lt;Entry&amp;lt;String,String&amp;gt;&amp;gt;表示map中的键值对都是String类型的。 ...
iterator迭代器的使用(771)
#include&amp;lt;iostream&amp;gt; #include&amp;lt;string&amp;gt; using namespace std; int main() {     string J = &quot;aA&quot;;     string S = &quot;aAAbbbb&quot;;     string::iterator i;//迭代器的使用     string::iterator j;          int c...
Python迭代器的使用(Iterator)
python中集合的数据类型有列表(list),元组(tuple),字典(dict),集合(set),字符串(str)等,这些都是可迭代的对象(Iterable),必须通过python内置方法iter()方法将这些可迭代的对象转化成迭代器对象,进而可以使用for循环进行遍历。下面通过isinstance()方法判断其具体的类型。代码如下:执行结果如下: 我们证实了这些集合数据类型是Iterab
关于 stl 的 list<...>::iterator 的声明问题,怎么会变成 list::iterator
迭代器 list<。。。>::iterator ite 怎么一直被系统识别成 list::iterator ? 下面是我的主要代码:rnrntypedef struct //一个结构体rn float w;rn int a, b;rn region_edge;rnrnlist * create_region_edge(。。。。) //返回一个listrnrnlist * edges; //生成listrnfor(..)rnrn region_edge * edge = new region_edge();rn edges->push_back(edge ); //添加元素rn ...rnrn return edges;rnrnrnvoid merge(....)rnrn list::iterator ite=region_edge->begin(); //有问题rn ...rnrn生成的迭代器 list::iterator ite 怎么被系统识别成 list::iterator ?rn
请教:遇到 STL中的vector 的线程安全问题:vector iterator not dereferencable
如题rn我通过push_back向一个vector对象注入了若干int型数据,rn并SetTimer(),在Timer函数中,依次取得vector对象中的数据。rnrn发现似乎是到了最后的一个元素时,程序崩溃~rn之前的元素都能够正常读取和使用。rnrn错误提示有:vector iterator not dereferencablern查了一下,说是线程安全方面的问题。rnrnSetTimer的确在内部开了线程,但我的这个问题具体是怎么回事呢?rnrn请各位帮忙指点迷津!rn谢谢!
vector中使用迭代器注意事项
1.使用iter++;和++iter;两种方式遍历的次数是相同的,但在STL中效率不同。前++返回引用,后++返回一个临时对象,因为iterator是类模板,使用 iter++这种形式要返回一个无用的临时对象,而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。 2.使用迭代器遍历时添加删除元素,可使用以下格式:for(iter = tria
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法