1

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

3 回答 3

4

你错过了typename应该list<T>::iterator iter是:

typename list<T>::iterator iter;

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

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

于 2013-03-21T09:36:06.507 回答
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

...

于 2013-03-21T09:50:23.957 回答
0

放一个typename

typename typename list<T>::iterator iter;
于 2013-03-21T09:37:27.520 回答