【问题标题】:Problem with iterators for std::list of boost::shared_ptrstd::list of boost::shared_ptr 的迭代器问题
【发布时间】:2009-11-29 09:14:15
【问题描述】:

以下代码有问题:

#include <list>
#include <boost/shared_ptr.hpp>
#include "Protocol/IMessage.hpp"

template <typename HeaderType>
class Connection {
 public:
  typedef IMessage<HeaderType>             MessageType;
  typedef boost::shared_ptr<MessageType>   MessagePointer; 

  template <typename Handler>
  void
  FlushMessageQueue(Handler handler) {
    std::list<MessagePointer>::iterator ib = message_queue_.begin(); // line 69
    std::list<MessagePointer>::iterator ie = message_queue_.end();
    for (; ib != ie; ++ib) {
      AsyncWrite(*ib, handler);
    }
  }

 private:
  std::list<MessagePointer> message_queue_;
};

gcc (4.2.1) 告诉我:

include/Network/Connection.hpp: In member function 'void Network::Connection<MT>::FlushMessageQueue(Handler)':
include/Network/Connection.hpp:69: error: expected `;' before 'ib'

我想知道为什么我不能为 MessagePointer 的列表创建迭代器。

有什么想法吗?

谢谢。

【问题讨论】:

    标签: c++ list templates boost shared-ptr


    【解决方案1】:

    std::list&lt;MessagePointer&gt; 在您的代码中是一个依赖类型(即它取决于模板参数的类型)。因此,您需要使用 typename 来声明 ::iterator 应该是所有潜在实例的类型(因为它可以是其中一些实例的值,如果它们是专门的)。所以:

    typename std::list<MessagePointer>::iterator ib = message_queue_.begin();
    

    【讨论】:

    • +1,为了简化输入,您可以在模板中添加 typedef:typedef typename std::list&lt;MessagePointer&gt;::iterator MessageIterator;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2011-09-27
    • 2013-06-12
    • 2013-04-16
    相关资源
    最近更新 更多