C++模版 vector list对象作为参数传入 编译错误

时间:2023-01-12 07:39:06
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<list>
#include<stack>
#include<set>
#include<algorithm>
#include<functional>
using namespace std;

//自定义排序函数
bool SortMyVeLIDe(const int & vL1, const int & vL2) {
return vL1 > vL2; //降序
}
bool SortMyVeLIIn(const int & vL1, const int & vL2) {
return vL1 < vL2;//升序
}
template<class T>
void PrintVecLI(T & vecli) {
T::iterator it= vecli.begin();
for ( ; it != vecli.end()  ; it++)
{
cout << *it << endl;
}
}
template<class T>
void SortMyVeLI(T & vecli) {
bool nFlag;
cout << "请选择想要排序的规则, 升序输入1,降序输入0" << endl;
cin >> nFlag;
//nFlag=0 降序
if (0 == nFlag)
{
cout << "降序" << endl;
sort(vecli.begin(), vecli.end(), SortMyVeLIDe);
}
//nFlag=1 降序
else {
cout << "升序" << endl;
sort(vecli.begin(), vecli.end(), SortMyVeLIIn);
}
}
template<class T>
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
vecli.insert(vecli.begin() + nIndex, nData);
else
cout << "索引超出范围!" << endl;
}
template<class T>
void DeleteData(T & vecli) {
int nIndex;
cout << "请输入要删除的元素索引:" << endl;
cin >> nIndex;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
{
T::iterator it = vecli.begin() + nIndex;
it = vecli.erase(it);
}
else
cout << "索引超出范围!" << endl;
}

void main() {
vector<int> Vec;
for (int i = 0; i < 10; i++)
{
Vec.push_back(rand() % 20);
cout << Vec[i] << endl;
}
SortMyVeLI<vector<int>>(Vec);
PrintVecLI<vector<int>>(Vec);
InsertData<vector<int>>(Vec);
PrintVecLI<vector<int>>(Vec);
DeleteData<vector<int>>(Vec);
PrintVecLI<vector<int>>(Vec);

cout << endl << endl;
list<int> MyList;
for (int i = 0; i < 10; i++)
{
MyList.push_back(rand() % 20);
}
SortMyVeLI<list<int>>(MyList);
PrintVecLI<list<int>>(MyList);
InsertData<list<int>>(MyList);
PrintVecLI<list<int>>(MyList);
DeleteData<list<int>>(MyList);
PrintVecLI<list<int>>(MyList);
}


下面是编译错误
d:\learning\大一下\c++\practice\practice\源.cpp(56): warning C4018: “<=”: 有符号/无符号不匹配
1>  d:\learning\大一下\c++\practice\practice\源.cpp(93): note: 参见对正在编译的函数 模板 实例化“void InsertData<std::vector<int,std::allocator<_Ty>>>(T &)”的引用
1>          with
1>          [
1>              _Ty=int,
1>              T=std::vector<int,std::allocator<int>>
1>          ]
1>d:\learning\大一下\c++\practice\practice\源.cpp(66): warning C4018: “<=”: 有符号/无符号不匹配
1>  d:\learning\大一下\c++\practice\practice\源.cpp(95): note: 参见对正在编译的函数 模板 实例化“void DeleteData<std::vector<int,std::allocator<_Ty>>>(T &)”的引用
1>          with
1>          [
1>              _Ty=int,
1>              T=std::vector<int,std::allocator<int>>
1>          ]

9 个解决方案

#1


求大佬帮忙 谢谢大家

#2


偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。

http://www.cplusplus.com

#3


试了试 问题就出现在 SortMyVeLI<vector<int>>(Vec);

InsertData<vector<int>>(Vec);

DeleteData<vector<int>>(Vec);


这三个模版函数 编译时 就会出错

#4


我一开始以为只是sort list和vector的方法函数不一样导致的 注释后发现 insert 和delete也出错  找不出来了  才刚接触stl

#5


vecli.insert(vecli.begin() + nIndex, nData);这句话里面的nData的类型在编译的时候推倒不出来吧

#6


vecli.begin() + nIndex

vector的迭代器有+index的操作,但是list的迭代器没有

#7


template<class T>
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
T::iterator it = T.begin();
for (int i = 0; i < nIndex; i++)
it++;
vecli.insert(it, nData);
else
cout << "索引超出范围!" << endl;
}

依旧编译错误。。

#8


template <typename Container>
void InsertData(Container & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size())) {
typename Container::iterator it = vecli.begin();
for (int i = 0; i < nIndex; i++)
{
it++;
}
vecli.insert(it, nData);
}

else
cout << "索引超出范围!" << endl;
}

终于弄好了  原来是 在编译时Container::iterator 不能认为是一种数据类型  要在前面加上typename才行  
 
谢谢大家  

#9


结贴啦 问题解决了 

#1


求大佬帮忙 谢谢大家

#2


偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。

http://www.cplusplus.com

#3


试了试 问题就出现在 SortMyVeLI<vector<int>>(Vec);

InsertData<vector<int>>(Vec);

DeleteData<vector<int>>(Vec);


这三个模版函数 编译时 就会出错

#4


我一开始以为只是sort list和vector的方法函数不一样导致的 注释后发现 insert 和delete也出错  找不出来了  才刚接触stl

#5


vecli.insert(vecli.begin() + nIndex, nData);这句话里面的nData的类型在编译的时候推倒不出来吧

#6


vecli.begin() + nIndex

vector的迭代器有+index的操作,但是list的迭代器没有

#7


template<class T>
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
T::iterator it = T.begin();
for (int i = 0; i < nIndex; i++)
it++;
vecli.insert(it, nData);
else
cout << "索引超出范围!" << endl;
}

依旧编译错误。。

#8


template <typename Container>
void InsertData(Container & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size())) {
typename Container::iterator it = vecli.begin();
for (int i = 0; i < nIndex; i++)
{
it++;
}
vecli.insert(it, nData);
}

else
cout << "索引超出范围!" << endl;
}

终于弄好了  原来是 在编译时Container::iterator 不能认为是一种数据类型  要在前面加上typename才行  
 
谢谢大家  

#9


结贴啦 问题解决了