2009-11-29 83 views
4

我在用下面的代碼有問題:問題的迭代器的std ::升壓名單:: shared_ptr的

#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列表創建一個迭代器。

任何想法?

謝謝。

回答

11

std::list<MessagePointer>在你的代碼中是一個依賴類型(即它依賴於模板參數的類型)。因此,您需要使用typename來說明::iterator預計會成爲所有潛在實例化的類型(因爲它們可能是其中一些實例的一個值,如果它們是專用的)。所以:

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

+1,並緩解輸入您可以將您的模板中的類型定義:'的typedef typename的標準::列表 ::迭代器MessageIterator;' – 2009-11-29 09:33:33

+0

的確。謝謝你,先生。 – 2009-11-29 09:39:55