c++ - 使用模板函数和迭代器显示vector中的元素
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-23 09:14:59
0
2
1066
#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_needforcpp11\practice_needforcpp11\源.cpp    8    
错误    C2061    语法错误: 标识符“iterator”    practice_needForCpp11    d:\practice_needforcpp11\practice_needforcpp11\源.cpp    8    
错误    C2672    “factorial”: 未找到匹配的重载函数    practice_needForCpp11    d:\practice_needforcpp11\practice_needforcpp11\源.cpp    18    
错误    C2780    “void factorial(std::vector<T,std::allocator<_Ty>>)”: 应输入 1 个参数,却提供了 2 个    practice_needForCpp11    d:\practice_needforcpp11\practice_needforcpp11\源.cpp    18    

请教各位一下这里出了什么问题~谢谢了~~

女神的闺蜜爱上我
女神的闺蜜爱上我

全部回复(2)
巴扎黑

改动两个位置,

改动前: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报错类型不匹配,这个我也没搞清楚。。。

曾经蜡笔没有小新

在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;
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板