我是C ++的新手。我正在使用g ++编译器。我试图用C ++学习STL库的操作。工作时我在这段代码中发现了一些问题。请解释错误原因以及如何处理错误。
#include<iostream>
#include<list>
using namespace std;
typedef struct corrd{
int x;
int y;
}XY;
int main()
{
list<XY> values;
list<XY>::iterator current;
XY data[10];
for(int i=0;i<10;i++)
{
data[i].x = i+10;
data[i].y = i+20;
}
for(int i=0;i<10;i++)
{
values.push_front(data[i]);
}
current = values.begin();
while(current!=values.end())
{
cout<<"X coord:"<<*current->x<<endl;//error: invalid type argument of unary ‘*’ (have ‘int’
cout<<"Y coord:"<<*current->y<<endl;//error: invalid type argument of unary ‘*’ (have ‘int’
current++;
}
}
答案 0 :(得分:2)
更新
cout<<"X coord:"<<*current->x<<endl;
cout<<"Y coord:"<<*current->y<<endl;
为:
cout<<"X coord:"<<(*current).x<<endl;
cout<<"Y coord:"<<(*current).y<<endl;
或
cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;
current
是迭代器,如果你尝试取消引用它(* current),*current
指向真实对象(x或y)是一个对象而不是指针,所以你需要调用{{1 }}。
如果你没有取消引用(*current).x
迭代器,你可以调用current
来引用真实对象。
另请注意,operator->
和operator->
具有不同的优先级,请参阅C++ Operator Precedence。
如果将operator*
指针存储在std :: list中,则应使用迭代器:
XY
答案 1 :(得分:0)
使用* current将迭代器“转换”为它包含的对象。由于你有XY结构(不是指针而是值),你应该写:
cout<<"X coord:"<<(*current).x<<endl;
cout<<"Y coord:"<<(*current).y<<endl;
(“。”而不是“ - &gt;”)。
另一种方法是使用“ - &gt;”迭代器的运算符。它允许直接使用包含类型(结构或类)的成员。然后你需要写:
cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;
只需删除'*'
即可答案 2 :(得分:0)
迭代器有点像通用指针(它具有*
和->
的相同语义。您正确使用->
来访问迭代器指向的结构的成员。该成员的类型为int
,因此没有任何内容可以取消引用。所以这样做:
cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;
答案 3 :(得分:0)
错误“unary'*'的无效类型参数(包含'int')”来自以下表达式:*current->x
。一元int
的{{1}}论证是什么?好吧,*
当然,如果你查看current->x
的声明,你会发现它是x
。
所以,你可以写int
,但这是乘法。解除引用的一元5 * current->x
需要右侧的(智能)指针或迭代器。
请注意,*
的优先级高于一元->
,因此代码不会被解析为*
,而是(*current)->x