在Ptr_Vector上提升FOR_EACH?

IAE*_*IAE 1 c++ boost ptr-vector boost-foreach

我正在尝试学习一些Boost图书馆.我目前正在做我认为未来的家庭作业项目(学期尚未开始).然而,这个问题不是关于作业问题,而是关于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;
Run Code Online (Sandbox Code Playgroud)

BOOST_FOREACH用于使用与上面完全相同的代码的法向量.自从我开始使用ptr_vectors以来,我得到了错误:

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

让我相信ptr_vector以某种方式模糊了foreach方法的指针.

如果我反而写

BOOST_FOREACH(Bid *bid, bids_)
Run Code Online (Sandbox Code Playgroud)

我得到了四种类型的错误

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

这很糟糕,因为我知道出价是一个指针.

如何BOOST_FOREACH正确地迭代ptr_vectors

Fer*_*cio 8

ptr_vector获取堆分配对象的所有权,并将每个对象作为引用呈现,因此您不需要解除引用并使用.而不是 - >来访问成员变量/函数.例如

Bid highestBid = 0;
BOOST_FOREACH (Bid& bid, bids_)
    if (bid.GetAuction()->GetName() == auction->GetName())
        highestBid = &bid;
Run Code Online (Sandbox Code Playgroud)

  • @Space_C0wb0y:我通常更喜欢将`reference`或`const_reference`用于`value_type`,复制时没有意义. (4认同)