2009-05-12 4 views
1

Pourquoi ce code ne parviennent pas à compiler avec VS 2005:problème avec boost :: bind et la fonction de membre retour auto_ptr

#include <boost/bind.hpp> 
#include <boost/function.hpp> 

struct X 
{ 
    typedef std::auto_ptr<int> IntType; 
    // typedef int IntType; // this works 

    IntType memfunc() const 
    { 
     return IntType(); 
    } 

    X() 
    { 
     boost::bind (&X::memfunc, this); 
    } 
}; 

avec cet avertissement & erreur:

1>j:\libraries\boost\boost_1_37_0\boost\bind.hpp(1643) : warning C4180: qualifier applied to function type has no meaning; ignored 
1>  j:\libraries\boost\boost_1_37_0\boost\bind.hpp(1677) : see reference to class template instantiation 'boost::_bi::add_cref<Pm,I>' being compiled 
1>  with 
1>  [ 
1>   Pm=std::auto_ptr<int> (__thiscall X::*)(void), 
1>   I=1 
1>  ] 
1>  j:\dev\test\test\listtest.cpp(16) : see reference to class template instantiation 'boost::_bi::dm_result<Pm,A1>' being compiled 
1>  with 
1>  [ 
1>   Pm=X::IntType (__thiscall X::*)(void), 
1>   A1=X * 
1>  ] 

?

La modification du typedef IntType en un simple entier permet de le compiler.

Répondre

3

Il semble que, malgré la documentation affirmant qu'ils sont équivalents, les œuvres alternatives suivantes:

boost::bind<IntType> (boost::mem_fn (&X::memfunc), this); 

Go figure ...

+0

Il n'est pas valide de dire "void f() const". C'est-à-dire, introduire un const pour un type de fonction sans utiliser typedef et quand ce n'est pas pour un type pointeur de membre (comme "void (M :: *)() const") n'est pas valide. Vous devez dire "typedef void f() const"; alors vous pouvez utiliser "f" comme un type de fonction const-qualifié. peut-être booster fait autrement quelque part dans son code. –

+0

De l'autre côté, l'avertissement pourrait également signifier que le const ici: template void f (T const &); est ignoré (il n'y a pas littéralement de type-fonction "const qualified"). Cette ignorance est formellement seulement contenue dans le document de travail C++ 1x, et pas encore dans C++ 98 et pas (à ma connaissance) dans C++ 03. Dans ces standards où il n'est pas encore contenu, une telle tentative de création d'une fonction constoe qualifiée typoe (comme dans "const T" - pas comme celle contenue dans mon précédent commentaire) est mal formée (aboutit à un avertissement ou une erreur). –

+0

oui, c'est le deuxième type de problème: la ligne en question fait ceci: typedef M const & type; avec M étant un type de fonction. essayant ainsi de qualifier littéralement un type de fonction, cédant à l'avertissement correct. –

0

Je ne sais pas, mais avez-vous essayé la syntaxe alternative bind où vous spécifiez le type de retour?

bind<IntType>(&X::memfunc, this); 
bind<std::auto_ptr<int> >(&X::memfunc, this); 
+0

Il donne la même erreur. –

+0

Cela fonctionne cependant: boost :: bind (boost :: mem_fn (& X :: memfunc), ceci); –

0

Pour votre information: gcc 4.3.3 compile le code bien.

Questions connexes