1

我目前正在尝试学习一些 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;

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_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 回答