1

私は現在、Boostライブラリのいくつかを学ぼうとして楽しんでいます。私は現在、将来の宿題プロジェクトになると思うことをやっています(学期はまだ始まっていません)。ただし、この質問は宿題の問題ではなく、ブーストに関するものです。

コード:

/* AuctionApplication.h */
class AuctionApplication : boost::noncopyable
{
private:
    boost::ptr_vector<Auction> auctions_;
    boost::ptr_vector<Bidder>  bidders_;
    boost::ptr_vector<Bid>     bids_;


/* AuctionApplication.cpp */
Bid *AuctionApplication::GetLatestBid(const Auction *auction)
{
    Bid *highestBid = 0;

    BOOST_FOREACH(Bid *bid, bids_) // Error here!
        if (bid->GetAuction()->GetName() == auction->GetName())
            highestBid = bid;

BOOST_FOREACHは、上記とまったく同じコードで通常のベクトルを操作するために使用します。ptr_vectorsを使い始めたので、次のエラーが発生します。

error C2440: '=' : cannot convert from 'Bid' to 'Bid *'

ptr_vectorがforeachメソッドからのポインターをどういうわけか覆い隠していると私を信じさせます。

代わりに書くなら

BOOST_FOREACH(Bid *bid, bids_)

このタイプのエラーが4つ発生します

error C2819: type 'Bid' does not have an overloaded member 'operator ->'

入札はポインタであることがわかっているので、これは最悪です。

どうすればBOOST_FOREACH適切に反復処理できptr_vectorsますか?

4

1 に答える 1

8

ptr_vectorは、ヒープに割り当てられたオブジェクトの所有権を取得し、各オブジェクトを参照として提示するため、逆参照する必要はなく、を使用します。->の代わりに、メンバー変数/関数にアクセスします。例えば

Bid highestBid = 0;
BOOST_FOREACH (Bid& bid, bids_)
    if (bid.GetAuction()->GetName() == auction->GetName())
        highestBid = &bid;
于 2010-09-23T13:08:57.423 に答える