2010-02-26 4 views
3

L'erreur complète que je reçois est la suivante:Boost :: erreur de fonction surcharge ambiguë pour « opérateur [] »

error: ambiguous overload for ‘operator[]’ in ‘a[boost::_bi::storage4<A1, A2, A3,  
boost::arg<I> >::a4_ [with A1 = boost::_bi::value<MsgProxy*>, A2 = boost::arg<1>, A3 = 
boost::arg<2>, int I = 3]]’ 

Il fait référence à la ligne 116 d'une classe que j'ai, ce qui est le boost :: bind appel dans cette fonction:

// Dispatch a message onto all connected clients 
void MsgProxy::dispatch_msg(t_ic_msg_shptr message) { 
    deque<t_socket_shptr>::const_iterator iter = clientList_.begin(); 

    for(; iter != clientList_.end(); ++iter) { 
     message->async_send(*iter, 
       boost::bind(&MsgProxy::handle_dispatch, this, _1, _2, _3)); 
    } 
} 

Pour référence, la fonction de répartition de la poignée ressemble à ceci:

// Called to handle result of saync_send command in dispatch_msg 
void MsgProxy::handle_dispatch(t_ic_msg_shptr messsage, t_socket_shptr socket_ptr, 
        const boost::system::error_code &error) { 
    if (error) { 
    RDEBUG("Error forwarding message onto clients -- %s", 
      error.message().c_str()); 
    } 
} 

Et enfin le async_send fonction qui est appelée:

void async_send  (t_socket_shptr, t_icsend_callback); 

Où t_icsend_callback est:

typedef boost::function<void (t_socket_shptr, const boost::system::error_code&)> 
                   t_icsend_callback; 

Fondamentalement, j'ai une fonction (async_send) qui prend une prise d'envoyer un message sur, ainsi qu'un rappel (défini en utilisant boost :: function) pour signaler l'état de manière asynchrone. J'essaye de lier un membre à cet argument boost :: function, mais boost ne semble pas aimer ce que je fais ici. J'ai été de haut en bas la fonction boost :: function et boost: bind documentation et il me semble que cela devrait fonctionner ... J'ai même un appel qui est presque identique un peu plus haut qui ne jette pas une erreur ... color me perplexe.

Répondre

2

t_icsend_callback est une fonction prenant 2 agréments.

boost::bind(&MsgProxy::handle_dispatch, this, _1, _2, _3) 

renvoie une fonction qui prend 3 arguments.

Je pense que vous voulez dire

message->async_send(*iter, 
      boost::bind(&MsgProxy::handle_dispatch, this, message, _1, _2)); 

(note "message" comme premier argument borné).

+1

Oh fils d'une arme à feu, j'aurais dû voir ça. Merci pour vos yeux d'aigle. Désolé, il m'a fallu si longtemps pour répondre, j'ai frappé mon pouce sur une scie à table et a dû faire un détour par l'ER. –

Questions connexes