2010-02-14 13 views
3

qui suit example from boost bind ne fonctionne pas pour moi:liaison aux variables membres

#include <boost/bind.hpp> 

struct A 
{ 
    int data; 
}; 

int main() 
{ 
    A a; 
    boost::bind(&A::data, _1)(a) = 1; 
} 

error: assignment of read-only location 'boost::bind [with A1 = boost::arg<1>, M = int, T = A](&A::data, (<unnamed>::_1, boost::arg<1>())).boost::_bi::bind_t<R, F, L>::operator() [with A1 = A, R = const int&, F = boost::_mfi::dm<int, A>, L = boost::_bi::list1<boost::arg<1> >](((A&)(& a)))'

Est-ce que je fais quelque chose de mal? Le compilateur est g ++ 4.4.0

+0

Juste réalisé quelque chose en suivant votre exemple de lien ci-dessus: vous essayez de suivre un exemple d'expression Boost.Lambda bind en utilisant Boost.Bind. Essayez d'inclure et et utilisez boost :: lambda :: bind + boost :: lambda :: _ 1 à la place. En outre, utilisez boost :: lambda :: var pour contenir une référence par. – rjnilsson

Répondre

2

solution de Unclebens est bien, mais je pensais que je rajouterais que si vous utilisez Boost.Lambda le problème disparaît:

#include <boost/lambda/bind.hpp> 

struct A { 
    int data; 
}; 

int main() { 

    namespace bll = boost::lambda; 

    A a; 
    bll::bind(&A::data, bll::_1)(a) = 1; 
} 

Et il fait si vous utilisez boost::mem_fn:

#include <boost/mem_fn.hpp> 

struct A { 
    int data; 
}; 

int main() { 

    boost::mem_fn(&A::data)(a) = 1; 
} 
3

Le type de résultat de cette expression de liaison est int (ou plutôt const int&). Je pense que vous pouvez override the return type:

boost::bind<int&>(&A::data, _1)(a) = 1; 
1

Je ne suis pas sûr de ce que vous voulez faire, mais ne surchargez pas vraiment Boost.Bind l'opérateur d'affectation? Si vous souhaitez attribuer la valeur 1 à a.data en utilisant l'objet fonction renvoyée Je pense que vous devez faire quelque chose comme ceci (note également que « a » besoin d'être lié par référence):

#include <boost/bind.hpp> 
#include <boost/ref.hpp> 
#include <cassert> 

void foo() 
{ 
    A a; 

    boost::bind(&A::data, _1)(boost::ref(a), 1); 

    assert(a.data == 1); 
} 

Si vous devez utiliser l'opérateur d'affectation, je pense que l'utilisation de Boost.Lambda ou Boost.Phoenix serait un meilleur choix.