2009-11-29 4 views
4

Je vais avoir un problème avec le code suivant:problème avec itérateurs pour std :: liste de boost :: 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) me dit:

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

Je me demande pourquoi je ne peux pas créer un itérateur pour une liste de MessagePointer.

Des idées?

Merci. Dans votre code est un type dépendant (c'est-à-dire que cela dépend du type d'un argument de modèle)

Répondre

11

std::list<MessagePointer> Par conséquent, vous devez utiliser typename pour indiquer que ::iterator devrait être un type pour toutes les instanciations potentielles (car il peut s'agir d'une valeur pour certaines d'entre elles, si elles sont spécialisées). Alors:

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

+1, et pour faciliter la saisie, vous pouvez ajouter un typedef dans votre modèle: 'typedef typename std :: liste :: iterator MessageIterator;' –

+0

En effet. Merci Monsieur. –

Questions connexes