4

次のコードに問題があります。

#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のリストのイテレータを作成できないのはなぜだろうか。

何か案は?

ありがとうございました。

4

1 に答える 1

11

std::list<MessagePointer>コード内の依存型です(つまり、テンプレート引数の型に依存します)。typenameしたがって、すべての潜在的なインスタンス化のタイプであると予想されることを示すために使用する必要があり::iteratorます(それらが特殊化されている場合、それらの一部の値になる可能性があるため)。それで:

typename std::list<MessagePointer>::iterator ib = message_queue_.begin();
于 2009-11-29T09:21:01.073 に答える