所以这是我的计划。这是非常自我解释的。有一个菜单有4个选项。每个选项都允许使用两个不同子菜单的版本。我正在处理列表和向量,但是现在这些列表给了我错误。我对迭代器做错了吗?我很确定这就是我所有的错误。
#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;
template <class T>
void lst(T inglethorp, int a)
{
list<T> mylist;
int sel = 10;
T ins;
int place;
list<T>::iterator iter; //is this wrong?
//error: expected ';' before 'iter'
//dependent-name 'std::list::iterator' is parsed as a non-type, but instantiation yields a type
switch(a)
{
case 1:
cout << "What would you like to load to the front?" << endl;
cin >> ins;
mylist.push_front(ins);
cout << endl << endl;
break;
case 2:
cout << "What would you like to load to the back?" << endl;
cin >> ins;
mylist.push_back(ins);
cout << endl << endl;
break;
case 3:
cout << "Where would you like to insert the value?" << endl;
cin >> place;
iter = mylist.begin(); //'iter' was not declared in this scope
for(int i=0; i < place; i++)
iter++;
cout << "What would you like to lod at this point?" << endl;
cin >> ins;
mylist.insert(iter, ins);
cout << endl << endl;
break;
case 4:
cout << "What would you like to search for?" << endl;
cin >> ins;
iter = find(mylist.begin(), mylist.end(), ins);
if(iter==mylist.end())
cout << ins << " was not founf." << endl << endl;
else
cout << ins << " is in the list" << endl << endl;
break;
case 5:
cout << "What would you like to remove?" << endl;
cin >> ins;
mylist.remove(ins);
cout << endl << endl;
break;
case 6:
for(iter = mylist.begin(); iter != mylist.end(); iter++)
cout << *iter << " " << endl << endl;
break;
case 0:
break;
default:
cout << "Enter a valid number between 0 and 6" << endl << endl;
break;
}
}
void listsub()
{
cout << endl << endl << "Linked List Sub-Menu" << endl;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
cout << "1. Insert a value at the front of the list" << endl;
cout << "2. Insert a value at the back of the list" << endl;
cout << "3. Insert a value at a given position in the list" << endl;
cout << "4. Search the list for a value" << endl;
cout << "5. Delete all instances of a value" << endl;
cout << "6. Print the list contents" << endl << endl;
cout << "0. Return to main homework menu" << endl;
cout << "+++++++++++++++++++++++++++++++++++++++++++++++++" << endl;
}
int main()
{
int sel = 10;
int subsel = 10;
int a = 1;
double b = 1.1;
int sel2 = 19;
while(sel != 0)
{
sel = 10;
subsel = 10;
cout << endl << endl << "Welcome to the CS222 Homework 7 Menu!" << endl;
cout << "=================================================" << endl;
cout << "1. Test the vector STL with integers" << endl; //not done yet
cout << "2. Test the vector STL with doubles" << endl; //not done yet
cout << "3. Test the list STL with integers" << endl;
cout << "4. Test the list STL with doubles" << endl << endl;
cout << "0. Exit" << endl;
cout << "=================================================" << endl << endl;
cin >> sel;
switch(sel)
{
case 1:
break;
case 2:
break;
case 3:
while(sel2 != 0)
{
listsub();
cin >> sel2;
lst(a, sel2);
}
sel2 = 12;
break;
case 4:
while(sel2 != 0)
{
listsub();
cin >> sel2;
lst(b, sel2);
}
sel2 = 12;
break;
case 0:
break;
default:
cout << "Select 0-4" << endl;
break;
}
}
return 0;
}
答案 0 :(得分:4)
您错过了typename
中list<T>::iterator iter
应该是:
typename list<T>::iterator iter;
这是因为list<T>
取决于模板参数T
,并且编译器默认假定list<T>::iterator
或依赖于T
的任何其他符号是值而不是一种。使用typename
通知编译器它确实是一个类型而不是值。
有关详情,请参阅Google“依赖名称查询”(例如wiki)。基本上问题是你可以专门化,比如说class list<int>
并将iterator
定义为一个值,并且在第一个编译过程中(解析)T
没有实例化(没有值)并且编译器还不知道每一个可能的专业化。
答案 1 :(得分:0)
放一个typename
typename typename list<T>::iterator iter;
答案 2 :(得分:0)
您需要typename
关键字才能使其工作正常。但是,我想你要做的是mylist
静态。你的代码总是使用一个新的空列表,可能不是你想要的。
template <class T>
void lst(T inglethorp, int a)
{
static list<T> mylist;
int sel = 10;
T ins;
int place;
typename list<T>::iterator iter; //OK
...