未能使用向量迭代器,c ++

Failing to use a vector iterator, c++

我试图迭代一个向量,其中包含指向student类型对象的指针。矢量声明如下:static vector students;

无论如何,我尝试在函数pickwinners()中使用迭代器:

1
2
3
vector<Student*>::iterator p1 = students.begin();
vector<Student*>::iterator p2 = p1;
p2++;

据我所知,p1是指向学生的指针。但是当我尝试这个的时候(例如):

1
*p1->print();

我得到下一个错误:

Hire.cpp:192: error: request for member ‘print’ in ‘* p1.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> with _Iterator = Student**, _Container = std::vector >’, which is of non-class type ‘Student*’
make: * [Hire.o] Error 1

这对我来说毫无意义。我知道问题不在print()中。我试过

1
2
Student *student = students.at(0);
student->print();

一切都很完美。我在这里很笨,有什么想法吗?谢谢!


期望的结果将通过

1
(*p1)->print();

在您的例子中,代码解析为*(p1->print());,因为operator->的优先级高于operator*,请参见维基百科上的优先级表。


你可能想要/需要(*p1)->print();,就像你写*(p1->print());一样。

可能是20:1,你最好是存储Student而不是Student *

一旦你解决了这个问题,你可能就想摆脱Student::print(),转而提供std::ostream &operator<<(std::ostream &, Student const &);。有了它,你可以做如下的事情:

1
std::cout << *p1;

而且(例如)打印整个数组的效果类似于:

1
2
3
std::copy(students.begin(), students.end(),
          std::ostream_iterator<Student>(std::cout,"
"
));


p1是一个迭代器,对于优先级规则,编译器将其解释为:

1
*(p1->print());

但你想要的是:

1
(*p1)->print();