用泛型方法遍历vector元素的问题

时间:2020-12-24 19:25:00
今天在学习c++的时候,写了这么一个程序,如下所示:
#include <iostream>
#include <vector>

using namespace std;

template<class T> void print(vector<T>& vec)
{
  vector<T>::iterator iter = vec.begin();
  cout<<"{";
  for(;iter < vec.end(); iter++)
    {
      if(iter != vec.begin())
cout<<", ";
      cout<<*iter;
    }
  cout<<"}";
}
int main()
{
  int a[5] = {7, 2, 7, 5, 1};
  vector<int> vec(a, a + 5);
  print(vec);
  return 0;
}

我想写一个万能的print函数,用于遍历输出所有vector类型的元素。但是用g++编译却给出如下的错误提示:

main.cpp: In function ‘void print(std::vector<T, std::allocator<_CharT> >&)’:
main.cpp:8: error: expected `;' before ‘iter’
main.cpp:10: error: ‘iter’ was not declared in this scope
main.cpp: In function ‘void print(std::vector<T, std::allocator<_CharT> >&) [with T = int]’:
main.cpp:22:   instantiated from here
main.cpp:8: error: dependent-name ‘std::vector::iterator’ is parsed as a non-type, but instantiation yields a type
main.cpp:8: note: say ‘typename std::vector::iterator

应该是类型之间的转化问题。
请问,我的这个程序存在什么问题?
抑或这样的思路根本就不对头?如果是,能否给出实现相同功能的print函数。
谢谢!

16 个解决方案

#1


呃,你的教材没告诉你typename这个关键字?

#2


我试验过了,在vs2005下运行良好!

#3


vc6 没问题

难道要
for(iter=vec.begin();iter < vec.end(); iter++)

#4


typename vector<T>::iterator

#5


vs2008也没错。。楼主改成这样试下
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型

#6


引用 5 楼 stardust20 的回复:
vs2008也没错。。楼主改成这样试下
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型
看来 gcc编译的还是很严格的!

#7


应该是g++

#8


引用 4 楼 pengzhixi 的回复:
typename vector<T>::iterator

哦,哦。

#9


的确,加完typename后编译就通过了,看来得好好找好typename的资料,谢谢大家!

#10


VS05下没问题啊,LS的说得很清楚,加上typename吧

#11


灌水一下

#12


支持很多STL容器, 不过貌似不支持map.(map的value是pair) 哪位可以帮忙改改.


#include <vector>
#include <iostream>
using namespace std;

template<class container>
void
Print(const typename container& c)
{
    copy(c.begin(), c.end(), ostream_iterator<typename container::value_type>(cout, "\n"));
}

int main(int argc ,char **argv)
{
    typedef vector<string> DATA;
    DATA Data;
    Data.push_back("A");
    Data.push_back("B");
    Data.push_back("C");

    Print<DATA>(Data);
    return 0;
}

#13


留个记号 , 我困了 先去睡觉在说

#14


看来不同编译器标准不一样啊,VS2005下对的我就也当对的了,看来以后用模板要多注意了

#15



明白了,必须显式告诉编译器将iterator当成类型。
否则的话,编译器默认是数据成员!!!

#16


为什么我看不到答案

#1


呃,你的教材没告诉你typename这个关键字?

#2


我试验过了,在vs2005下运行良好!

#3


vc6 没问题

难道要
for(iter=vec.begin();iter < vec.end(); iter++)

#4


typename vector<T>::iterator

#5


vs2008也没错。。楼主改成这样试下
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型

#6


引用 5 楼 stardust20 的回复:
vs2008也没错。。楼主改成这样试下
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型
看来 gcc编译的还是很严格的!

#7


应该是g++

#8


引用 4 楼 pengzhixi 的回复:
typename vector<T>::iterator

哦,哦。

#9


的确,加完typename后编译就通过了,看来得好好找好typename的资料,谢谢大家!

#10


VS05下没问题啊,LS的说得很清楚,加上typename吧

#11


灌水一下

#12


支持很多STL容器, 不过貌似不支持map.(map的value是pair) 哪位可以帮忙改改.


#include <vector>
#include <iostream>
using namespace std;

template<class container>
void
Print(const typename container& c)
{
    copy(c.begin(), c.end(), ostream_iterator<typename container::value_type>(cout, "\n"));
}

int main(int argc ,char **argv)
{
    typedef vector<string> DATA;
    DATA Data;
    Data.push_back("A");
    Data.push_back("B");
    Data.push_back("C");

    Print<DATA>(Data);
    return 0;
}

#13


留个记号 , 我困了 先去睡觉在说

#14


看来不同编译器标准不一样啊,VS2005下对的我就也当对的了,看来以后用模板要多注意了

#15



明白了,必须显式告诉编译器将iterator当成类型。
否则的话,编译器默认是数据成员!!!

#16


为什么我看不到答案