2

我是 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++;
}
}
4

4 回答 4

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)是一个对象而不是指针,所以你需要调用(*current).x.

如果你不取消引用current迭代器,你可以调用operator->来引用真实的对象。

另请注意operator->operator*具有不同的优先级,请参阅C++ Operator Precedence

如果将XY指针存储在 std::list 中,则应以这种方式使用迭代器:

list<XY*> values;
list<XY*>::iterator current;
cout<<"X coord:"<<(*current)->x<<endl;  // parentheses is needed due to Operator Precedence
cout<<"Y coord:"<<(*current)->y<<endl;
于 2013-10-02T06:56:11.960 回答
0

错误“invalid type argument of unary '*' (have 'int')”来自以下表达式:*current->x. unary的那个int论点是*什么?好吧,current->x当然,如果您查看 的声明x,您会发现它是一个int.

所以,你可以写5 * current->x,但那是乘法。一元*,解引用,需要一个(智能)指针或迭代器在右边。

请注意,->它的优先级高于 unary *,因此代码不会被解析为,(*current)->x而是被解析为*(current->x)

于 2013-10-02T07:02:49.067 回答
0

您使用 *current 将迭代器“转换”为它包含的对象。因为那里有 XY 结构(不是指针,而是值),所以你应该写:

cout<<"X coord:"<<(*current).x<<endl;
cout<<"Y coord:"<<(*current).y<<endl;

(“。”而不是“->”)。

另一种方法是使用迭代器的“->”运算符。它允许直接使用包含类型(结构或类)的成员。然后你需要写:

cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;

只需删除'*'

于 2013-10-02T06:57:26.573 回答
0

迭代器有点像通用指针(它与*and具有相同的语义->)。您正确地->用于访问迭代器指向的结构的成员。该成员是 type int,所以没有什么可以取消引用的。所以只需这样做:

cout<<"X coord:"<<current->x<<endl;
cout<<"Y coord:"<<current->y<<endl;
于 2013-10-02T06:58:09.983 回答