2010-09-23 3 views
1

В настоящее время я получаю удовольствие, пытаясь узнать некоторые из книг Boost. В настоящее время я делаю то, что, как я думаю, станет будущим домашним проектом (семестр еще не начался). Однако этот вопрос касается не проблемы с домашней работой, но и о Boost.Boost FOR_EACH Over A Ptr_Vector?

Код:

/* 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 как-то скрывает указатель от метода Еогеасп.

Если я вместо этого написать

BOOST_FOREACH(Bid *bid, bids_) 

Я получаю четыре ошибки типа

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

который всасывает, потому что я знаю, ставка является указателем.

Как я могу сделать BOOST_FOREACH правильной итерации над ptr_vectors?

+0

Возможно, связано с http://stackoverflow.com/questions/461507/. –

ответ

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' при итерации по контейнерам. –

+4

@ Space_C0wb0y: Обычно я предпочитаю использовать 'reference' или' const_reference' значение 'value_type', никакого смысла при копировании. –

Смежные вопросы