列表的迭代器错误

Iterator errors with lists

本文关键字:错误 迭代器 列表      更新时间:2023-10-16

这就是我的程序。这是不言自明的。有一个菜单有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;
}

您在list<T>::iterator iter中缺少一个typename,它应该是:

typename list<T>::iterator iter;

这是因为list<T>依赖于模板参数T,并且编译器默认认为list<T>::iterator或依赖于T的任何其他符号是一个值而不是类型。使用typename通知编译器它确实是一个类型而不是一个值。

更多信息,谷歌"依赖名称查找"(例如wiki)。基本上,问题是您可以专门化,例如class list<int>并将iterator定义为一个值,并且在第一次编译过程(解析)中T没有实例化(没有值),并且编译器还不知道每个可能的专门化。

添加typename

typename typename list<T>::iterator iter;

您需要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