问题描述
#include <iostream>#include <vector>#include <iterator>using namespace std;template<typename T>void factorial(vector<T> ivec, vector<T>::iterator iter) { while (iter != ivec.end()) {cout << *iter << endl;++iter; }}int main() { vector<int> ivec = { 1,2,3,4,5,6,7 }; factorial(ivec, ivec.begin()); return 0;}
在VS 2017中他的报错信息如下:
警告 C4346 “std::vector<T,std::allocator<_Ty>>::iterator”: 依赖名称不是类型 practice_needForCpp11 d:practice_needforcpp11practice_needforcpp11源.cpp 8 错误 C2061 语法错误: 标识符“iterator” practice_needForCpp11 d:practice_needforcpp11practice_needforcpp11源.cpp 8 错误 C2672 “factorial”: 未找到匹配的重载函数 practice_needForCpp11 d:practice_needforcpp11practice_needforcpp11源.cpp 18 错误 C2780 “void factorial(std::vector<T,std::allocator<_Ty>>)”: 应输入 1 个参数,却提供了 2 个 practice_needForCpp11 d:practice_needforcpp11practice_needforcpp11源.cpp 18
请教各位一下这里出了什么问题~谢谢了~~
问题解答
回答1:改动两个位置,
改动前:void factorial(vector<T> ivec, vector<T>::iterator iter)改动后:void factorial(vector<T> & ivec, typename vector<T>::iterator iter)
先说第二个改动位置,typename是干嘛的?参考http://blog.csdn.net/laojiu_/...
第一个改动位置,我也说不清,不加引用的话,在与end()比较的时候vs报错类型不匹配,这个我也没搞清楚。。。
回答2:在Vs2008上运行,会报错。错误的原因有:(1)vector<int> ivec = { 1,2,3,4,5,6,7 }; vector不能直接这样初始化赋值。可以用这样来替换
vector<int> ivec; for(int i=1;i<8;i++){ivec.push_back(i); }
(2)函数写的很不好,直接用这样写就行了,根本没必要传ivec.begin()给函数。因为你已经传了ivec给函数,函数就会得到ivec的所有信息,不必画蛇添足。
#include 'iostream'#include <vector>using namespace std;void factorial(vector<int> ivec) { vector<int>::iterator it; for(it=ivec.begin();it!=ivec.end();it++) cout<<*it<<endl;}int main(){ vector<int> ivec; for(int i=1;i<8;i++){ivec.push_back(i); } factorial(ivec); return 0;}