错误 C2064:术语不计算为采用 1 个参数的函数
Posted
技术标签:
【中文标题】错误 C2064:术语不计算为采用 1 个参数的函数【英文标题】:error C2064: term does not evaluate to a function taking 1 arguments 【发布时间】:2011-05-19 21:22:55 【问题描述】: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));
错误 1 C:\Program Files\Microsoft Visual Studio 10.0\VC\include\algorithm 22 1 Simulation
为什么会出现这个错误?
更新
将Student
更改为pStd
更新 // 算法文件
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);
顺便说一句,如果我将DelAndNullify
定义为static
,那么以下行将通过编译器
for_each(m_vecStudents.begin(), m_vecStudents.end(), ptr_fun(&School::DelAndNullify));
2012 年 5 月 9 日更新
#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://***.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;
错误 1 错误 C2535: 'void std::binder1st<_fn2>::operator ()(Student *&) const' : 成员函数已定义或声明 c:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional 299
【问题讨论】:
您应该得到一个包含错误的行号。请在您向我们展示的代码上注明。 @David,它抱怨 for_each 语句。 ——谢谢 对应哪一行? @Anyone 可以帮助我最新发布的完整代码在我按照以下所有 cmets 后无法通过 VS2010? 【参考方案1】:std::mem_fun(&School::DelAndNullify)
返回一个二元仿函数,它采用 School*
和 Student*
,但 std::for_each
期望一元仿函数仅采用 Student*
。请改用Boost.Bind:
std::for_each(
m_vecStudents.begin(),
m_vecStudents.end(),
boost::bind(&School::DelAndNullify, this, _1)
);
如果您有足够新的编译器,那么您可以使用std::bind
或std::tr1::bind
代替Boost 库;或者,如果您使用的是支持 C++11 lambda 的编译器,那么您可以执行以下操作,而不是使用任何 bind
:
std::for_each(
m_vecStudents.begin(),
m_vecStudents.end(),
[this](Student*& s) DelAndNullify(s);
);
【讨论】:
您在标准 C++ (1998) 中有std::bind1st
,它在这里运行良好。无需提升。
@AlexandreC :技术上同意,但我从不向任何人推荐 C++98 功能适配器,因为它们的用法是如此丑陋和冗长。
@ildjam:在这个简单的例子中,设置 boost 并让你的编译时间飞涨是不值得的。但是,您是对的,因为他使用 VS2010,所以 OP 可以使用 std::bind
。
@AlexandreC :如果包含 Boost.Bind 会影响编译时间(尤其是启用预编译头文件),我会感到惊讶,并且为非平凡的 C++ 工作 IMO 设置 Boost 总是值得的。
【参考方案2】:
看起来mem_fun
把你的成员函数变成了一个“静态”函数,它把一个对象作为它的第一个参数,比如:
static void DelAndNullfify(Student *pStudent);
但是你已经在 pre-mem_fun'd 函数中有一个参数,所以你最终得到:
static void DelAndNullfify(School *pSchool, Student* &prStudent);
一个参数太多了。
【讨论】:
【参考方案3】:这个
mem_fun(&School::DelAndNullify)
返回一个二进制函数,期望School*
和Student*
。
使用
bind1st(mem_fun(&School::DelAndNullify), this)
改为。
【讨论】:
我试过了,还是不行。错误 1 错误 C2535: 'void std::binder1st<_fn2>::operator ()(Student *&) const' : 成员函数已定义或声明 C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xfunctional 299 1 次模拟 @q087:你注意到我忘了冒号了吗?现已修复,应该可以使用。 我已经发布了我所有采纳你建议的示例代码。但是,错误仍然存在。你可以试一试吗? ——谢谢 @q0987:你错过了#include <functional>
。
@q0987:另外,using namespace std
通常是个坏主意(尤其是对于 MSVC)。如果不起作用,请尝试资格:std::bind1st(std::mem_fun(...))
以上是关于错误 C2064:术语不计算为采用 1 个参数的函数的主要内容,如果未能解决你的问题,请参考以下文章
明显调用的表达式前的括号必须具有(指针)函数类型 编译器错误 C2064