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.
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. –
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). –
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. –