2010-09-23 73 views
1

我目前正在嘗試學習一些Boost庫。我目前正在做我認爲將來的家庭作業項目(學期還沒有開始)。然而,這個問題不是關於作業問題,而是關於Boost。通過Ptr_Vector提升FOR_EACH?

代碼:

/* 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_) 

我得到的類型

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

它很爛,因爲我知道出價是一個指針的四大誤區。

如何讓BOOST_FOREACHptr_vectors上正確重複?

+0

可能與http://stackoverflow.com/questions/461507/有關。 – 2010-09-23 13:08:32

回答

8

ptr_vector獲取堆分配對象的所有權,並將每個對象顯示爲引用,因此您不需要解引用並使用它。而不是 - >來訪問成員變量/函數。例如

Bid highestBid = 0; 
BOOST_FOREACH (Bid& bid, bids_) 
    if (bid.GetAuction()->GetName() == auction->GetName()) 
     highestBid = &bid; 
+0

正如在[這個問題](http://stackoverflow.com/questions/461507/)的接受答案中指出的,當迭代容器時,可以通過使用'value_type'來避免這種情況。 – 2010-09-23 13:10:25

+4

@ Space_C0wb0y:我通常更喜歡將'reference'或'const_reference'用於'value_type',在複製時沒有意義。 – 2010-09-23 13:49:36