#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++)
难道要
for(iter=vec.begin();iter < vec.end(); iter++)
#4
typename vector<T>::iterator
#5
vs2008也没错。。楼主改成这样试下
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型
#6
看来 gcc编译的还是很严格的!
#7
应该是g++
#8
哦,哦。
#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当成类型。
否则的话,编译器默认是数据成员!!!
明白了,必须显式告诉编译器将iterator当成类型。
否则的话,编译器默认是数据成员!!!
#16
为什么我看不到答案
#1
呃,你的教材没告诉你typename这个关键字?
#2
我试验过了,在vs2005下运行良好!
#3
vc6 没问题
难道要
for(iter=vec.begin();iter < vec.end(); iter++)
难道要
for(iter=vec.begin();iter < vec.end(); iter++)
#4
typename vector<T>::iterator
#5
vs2008也没错。。楼主改成这样试下
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型
typename vector<T>::iterator iter = vec.begin();加个typename说明它是个类型
#6
看来 gcc编译的还是很严格的!
#7
应该是g++
#8
哦,哦。
#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当成类型。
否则的话,编译器默认是数据成员!!!
明白了,必须显式告诉编译器将iterator当成类型。
否则的话,编译器默认是数据成员!!!
#16
为什么我看不到答案