0

これはおそらくばかげたエラーですが、次のエラーが表示されます。

    error: request for member ‘speak’ in ‘it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator* [with _Iterator = Bird* const*, _Container = std::vector<Bird*>, __gnu_cxx::__normal_iterator<_Iterator, _Container>::reference = Bird* const&]()’, which is of non-class type ‘Bird* const’

エラーの原因となっているコードは次のとおりです。

void Aviary::speakAll(std::ostream &os) const{
for(std::vector<Bird*>::const_iterator it = birds.begin(); it != birds.end(); it++){
    it->speak(os);
}

}

Bird ポインターを格納するために使用している構造は次のとおりです。

typedef std::vector<Bird*> Birds;

void Aviary::addBird(Bird *bird){
if(!bird) throw std::logic_error("");
birds.push_back(bird);

}

問題は、ポインターからオブジェクトのメンバー関数を呼び出す方法です。

4

1 に答える 1

3

値ではなくポインターを反復処理しています。イテレータが指す値を参照するには、->or*を使用します。値はポインタであるため、2 番目の参照解除が必要です。

(*it)->speak(os);
// or
(**it).speak(os);

ここで、*itmeansを私に渡し、次に 2 番目*または->meansが pointer を逆参照します

于 2013-10-03T17:17:52.993 に答える