2011-09-06 11 views
1

私は、Student型のオブジェクトへのポインタを持つベクトルを反復しようとしています。 ベクトルの宣言は以下の通りである:とにかくstatic vector<Student*> students;ベクトル反復子の使用に失敗しました、C++

、私は()関数pickWinnersでイテレータを使用しようとしています:

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

私は理解しているように、P1は、学生へのポインタへのポインタです。私は、(例えば)これをしようとすると、しかし:

*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()にないことを知っています。 試しました

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

すべてが完璧に機能しました。私はここでかなり無知だよ、どんなアイデア? ありがとう!

答えて

10

所望の結果は、あなたのケースで

(*p1)->print(); 

によって達成されるであろうoperator->operator*より高い優先順位を有するので、コードは、*(p1->print());として解析し、例えば参照、the precedence table on wikipedia

+0

おお、そう愚か。ありがとう、toda – yotamoo

1

p1はイテレータと優先ルールの場合、コンパイラは次のように解釈します。

*(p1->print()); 

欲しいです:

(*p1)->print(); 
3

は、あなたはおそらくしたい/、それはあなたが*(p1->print());

チャンスは書いたかのように解析しますされたよう-必要(*p1)->print();を約20:1あなたは本当にStudentを格納したほうが良いと思いますsの代わりにStudent *を入力します。

これを修正したら、おそらくStudent::print()を取り除き、代わりにstd::ostream &operator<<(std::ostream &, Student const &);を指定することをお勧めします。代わりにそのことを、あなたのような何かをすることができます

std::cout << *p1; 

をし、(例えば)あなたの全体の配列を印刷するようなものということになります:

std::copy(students.begin(), students.end(), 
      std::ostream_iterator<Student>(std::cout, "\n")); 
+0

+1。あなたは賭けを取っているのか、あるいは単にオッズを呼んでいますか? – Potatoswatter

+0

+1はオブジェクトへのポインタを格納しません。 –

+0

@Potatoswatter:オッズをコールするだけです。 –

関連する問題