函数调用给我的错误表达式必须具有类类型

时间:2014-05-30 20:42:29

标签: c++ list pointers iterator

我做了一个函数调用,简单来说,它显示了我有值的列表的内容。这是函数定义:

void display_list(list<string>*type_list)
{
    cout << "You made a function call" << endl;
    for (list<string>::iterator dis = type_list.begin(); dis != type_list.end(); ++dis)
    {
        cout << *dis;
        cout << "\n";
    }
}

所有这一切应该让我更容易,因为我的代码中有很多次我必须显示列表的内容,所以我试图让自己更容易并且为函数调用所以我所要做的就是进行函数调用:

display_list(&list_name_here);

虽然一切正常,但你可以看到我添加了一个测试&#39; cout&#39;确保函数调用正常,但它没有显示内容,我得到一个突出显示

的错误
type_list

并弹出错误,表示表达式必须具有类类型?

现在我确实将代码更改为:

   void display_list(list<string>*type_list)
{
    cout << "You made a function call" << endl;
    list<string> gen;
    *type_list = gen;

    for (list<string>::iterator dis = gen.begin(); dis != gen.end(); ++dis)
    {
        cout << *dis;
        cout << "\n";
    }
}

在这种形式中,我将type_list解引用到局部变量中,然后继续正常进行..由于此方法确实摆脱了类类型错误,但是当我编译并运行它时,没有任何内容从列表中显示出来。 list非常简单,所以它应该只显示10个值。

现在,如果您要问,原始算法放在我的主代码中并且我用适当的列表名称替换type_list,那么代码就可以完美地设计。显示列表的内容。所以我知道我的错误不在其中。

任何人都可以对此有所了解吗?

4 个答案:

答案 0 :(得分:2)

您需要使用->从指针访问成员和成员函数。

void display_list(list<string>*type_list)
{
    cout << "You made a function call" << endl;
    for (list<string>::iterator dis = type_list->begin(); dis != type_list->end(); ++dis)
    {
        cout << *dis;
        cout << "\n";
    }
}

关于第二次尝试中空列表的问题,

list<string> gen;
*type_list = gen;

*type_list设置为gen,但不会更改gengen是一个空列表,您可以继续迭代它。

您可以使用:

list<string> gen = *typ_list;

或(谢谢@MattMcNabb)

list<string>& gen = *typ_list;

答案 1 :(得分:0)

在行中:

*type_list = gen;

您要将type_list更改为指向gen。请注意,gen此时为空。 此外,稍后您在gen循环中使用for中的迭代器,尽管其中没有任何内容。

您可能想要读取该行:

gen = *type_list;

gen是不必要的,你可以直接从type_list获得一个迭代器。

答案 2 :(得分:0)

我很困惑。您的函数display_list并没有真正做任何事情。

这是我对你的功能的检查。

通过const引用
除非您打算对其进行修改,否则应通过常量引用传递大型数据结构。显示功能不应该修改其参数:

当时:
   void display_list(list<string>*type_list)
改为:
   void display_list(const list<string>& type_list)

复制空列表会删除现有列表
此行创建一个名为gen的空列表     list<string> gen;

此行将空列表复制到传递的列表中:
    *type_list = gen;

迭代空列表没有功能
由于gen列表因为您新创建它而为空,因此此循环不具备任何功能。

for (list<string>::iterator dis = gen.begin(); dis != gen.end(); ++dis)
{
    cout << *dis;
    cout << "\n";
}

你想做什么?

你真的需要在打印前复制一份清单吗? (无缘无故地复制列表会浪费数据和执行时间。)

为什么要修改您传递的列表?

我很困惑。

编辑1:
显示列表的代码:

void display_list(const std::list<string>& type_list)
{
  std::list::const_iterator iter;
  for (iter =  type_list.begin();
       iter != type_list.end();
     ++iter)
  {
    std::cout << *iter << "\n";
  }
}

请参阅:无需创建新列表或复制旧列表。

该功能不会根据参数列表中的const并使用const_iterator修改列表。

由于列表是通过引用传递的,没有指针,也没有解引用问题。

答案 3 :(得分:0)

.运算符仅用于对象。要查找您指向的对象上的成员,请写入(*ptr).name或等效ptr->name

示例:

string s;
string *ptr = &s;

cout << s.size() << "\n";
cout << ptr->size() << "\n";

话虽如此,更好的解决方法是通过引用传递列表,而不是通过指针传递:

void display_list(list<string> &type_list)

然后使用.语法。

更好的方法是通过const引用;然后你也使用const_iterator