erreur C2064: terme n'évalue pas à une fonction prenant 1 arguments
class Student {
//...
bool Graduate() { return m_bGraduate; }
//...
};
class School {
vector<Student*> m_vecStudents;
void DelAndNullify(Student* &pStd);
void Fun1();
};
void School::DelAndNullify(Student* &pStd)
{
if ( (pStd != NULL) && (pStd->Graduate()) )
{
delete pStd;
pStd = NULL;
}
}
void School::Fun1()
{
for_each(m_vecStudents.begin(), m_vecStudents.end(), mem_fun(&School::DelAndNullify));
}
Erreur 1 erreur C2064: terme n'évalue pas à une fonction prenant 1 arguments C:\Program Files\Microsoft Visual Studio 10.0\VC\include\algorithme 22 1 Simulation
Pourquoi j'ai cette erreur?
mis à jour
changement Student
à pStd
mis à jour //algorithme de fichier
template<class _InIt, class _Fn1> inline
_Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{
//perform function for each element
for (; _First != _Last; ++_First)
_Func(*_First); //<<<<<<<< this line!
return (_Func);
}
BTW, si je définir le DelAndNullify
comme static
ensuite la ligne suivante passe le compilateur
for_each(m_vecStudents.begin(), m_vecStudents.end(), ptr_fun(&School::DelAndNullify));
Mis à jour 05/09/2012
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
#include <iostream>
#include <iomanip>
#include <functional>
#include <boost/bind.hpp>
class Student {
public:
Student(int id, bool bGraduate) : m_iID(id), m_bGraduate(bGraduate) {}
bool Graduate() const { return m_bGraduate; }
private:
int m_iID;
bool m_bGraduate;
};
class School {
public:
School(int numStudent)
{
for (int i=0; i<numStudent; ++i)
{
m_vecStudents.push_back(new Student(i+1, false));
}
}
~School()
{
//deallocate the allocated student resource to prevent memory leak!
}
void DelAndNullify(Student* &pStd);
void Fun1();
private:
std::vector<Student*> m_vecStudents;
};
void School::DelAndNullify(Student* &pStd)
{
if ( (pStd != NULL) && (!pStd->Graduate()) )
{
delete pStd;
pStd = NULL;
}
}
void School::Fun1()
{ //http://stackoverflow.com/questions/6065041/error-c2064-term-does-not-evaluate-to-a-function-taking-1-arguments
std::for_each(m_vecStudents.begin(), m_vecStudents.end(), std::bind1st(std::mem_fun(&School::DelAndNullify), this));
//boost::bind(&School::DelAndNullify, this, _1);
}
int main(int /*argc*/, char* /*argv*/[])
{
School school(10);
school.Fun1();
return 0;
}
Erreur 1 erreur C2535: "void std::binder1st<_Fn2>::operator ()(Étudiant
*&) const' : membre de la fonction déjà définie ou déclarée c:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional 299
Vous devez obtenir un numéro de ligne avec votre erreur. Veuillez indiquer sur le code que vous avez montré.
il se plaint de l'for_each déclaration. -- je vous remercie
La ligne qui correspond-il ?
peut aider sur mon dernier posté code complet qui ne peut pas transmettre le VS2010 après j'ai suivi tous les commentaires comme suit?
Mon dieux, quel gâchis.
il se plaint de l'for_each déclaration. -- je vous remercie
La ligne qui correspond-il ?
peut aider sur mon dernier posté code complet qui ne peut pas transmettre le VS2010 après j'ai suivi tous les commentaires comme suit?
Mon dieux, quel gâchis.
OriginalL'auteur q0987 | 2011-05-19
Vous devez vous connecter pour publier un commentaire.
std::mem_fun(&School::DelAndNullify)
retourne un foncteur binaire qui prend unSchool*
et unStudent*
, maisstd::for_each
attend un foncteur unaire ne prendre qu'unStudent*
. Utilisation Boost.Lier au lieu de cela:Si vous avez suffisamment récente compilateur, alors vous pouvez utiliser
std::bind
oustd::tr1::bind
à la place de la bibliothèque Boost; ou, si vous utilisez un compilateur C++11 lambda de support, vous pouvez effectuer les opérations suivantes au lieu d'utiliser toutbind
:std::bind1st
dans la norme C++ (1998), qui fonctionne bien ici. Pas besoin de coup de pouce.Techniquement, d'accord, mais je n'ai jamais recommander le C++98 fonctionnelle adaptateurs à tous, car leur utilisation est si laid et verbeux.
dans ce cas simple, la configuration de stimuler et d'avoir votre temps de compilation monter en flèche n'est pas la peine. Cependant, vous avez raison en ce que les OP peuvent utiliser
std::bind
depuis (s), il utilise les VS2010.Je serais étonné si, y compris Boost.Lier affecte les temps de compilation à tous (surtout avec les en-têtes précompilés activé), et il est toujours utile de définir coup de pouce pour les non-trivial C++ de travail de l'OMI.
OriginalL'auteur ildjarn
Ressemble
mem_fun
transforme votre fonction membre en "statique", une fonction qui prend un objet comme premier paramètre, comme:Mais vous avez déjà un paramètre dans la pré-mem_fun avais fonction, de sorte que vous vous retrouvez avec:
C'est un paramètre trop.
OriginalL'auteur Andomar
ce
renvoie une binaire fonction, s'attendant à un
School*
et unStudent*
.Utilisation
à la place.
Avez-vous remarqué que j'ai oublié une virgule ? Fixe maintenant, devrait fonctionner.
J'ai posté toutes mes exemple de code qui a adopté la suggestion. Cependant, l'erreur tient toujours. Peut vous prendre un essai? -- je vous remercie
Il vous manque des
#include <functional>
.aussi,
using namespace std
est souvent une mauvaise idée (surtout avec MSVC). Si cela ne fonctionne pas, essayez de vous qualifier:std::bind1st(std::mem_fun(...))
OriginalL'auteur Alexandre C.