关于VC6中使用for_each时遇到的问题,请高人解答一下

bluetide 2006-08-09 02:57:08
确切的说是MFC框架内开发的时候遇到的问题:

class Element
{
...
};

class ViewData
{
public:
vector<Element*> vecpe;
...
};

class CMyView : public CView
{
public:
void show(Element* pe) { // 根据pe所指对象的内部数据在屏幕上画东东 }
void showAll();
private:
ViewData vd;
};

void CMyView::showAll()
{
using namespace std;
for_each(vd.vecpe.begin(),
vd.vecpe.end(),
&CMyView::show); // 该处编译报错:error C2064: term does not
// evaluate to a function
}

...

(我认为这里不应该用mem_fun,因为show并不是Element的成员函数。)

编译错的大意是无法将&CMyView::show解析为一个函数,但是应该是没有问题的啊,而且我查看了VC的<algorithm>文件里的for_each的定义:

// TEMPLATE FUNCTION for_each
template<class _II, class _Fn> inline
_Fn for_each(_II _F, _II _L, _Fn _Op)
{for (; _F != _L; ++_F)
_Op(*_F); // 编译到该步出错
return (_Op); }

但是我觉得没有什么问题,百思不得其解,请大侠指点一下啊!
...全文
833 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-10-15
  • 打赏
  • 举报
回复
楼主,你这个问题用mem_fun是解决不了的。
要么,上boost,要么手写循环,要么,show成为static函数。
Muf 2006-10-13
  • 打赏
  • 举报
回复
bluetide(蓝潮):
我的编译器是vc2005,所以mem_fun的参数可能与vc6不太一样。
但道理是一样的,你查一下帮助文档,估计适当的改一下就可可以了。
bluetide 2006-08-11
  • 打赏
  • 举报
回复
ddstudent() 的这个方法可以通过编译,不过似乎这个函数没有被调用,继续研究中,也行对cpp中stl了解得比较深入的朋友提供一下解答
ddstudent 2006-08-11
  • 打赏
  • 举报
回复
member function pointer 只是一个函数的位移, 还要 class object 才能找到真正的函数地址

我用 debugger 跟踪了一下程序 (回答別人的 member function pointer 问题)
结果发现用 member function pointer 必需要有 class 的实体才能使用, 因为 class 的変数是每一个实体都不一样的, member function pointer 的地址也並不是实体的函数地址, 这个地址可能是一个位移值或是相关的东西, 必需配合实体一起使用

class Test
{
public:
double x;
double square(double y) { return y*y+x; };
double add(dobule y) {return y+x;};
};

double qgaus(Test *obj, double (Test::*fun)(double), double a_arg, double b_arg)
{
int j;
double xr,xm,dx,s;
static double x[]={0.0,0.1488743389,0.4333953941, 0.6794095682,0.8650633666,0.9739065285};
static double w[]={0.0,0.2955242247,0.2692667193, 0.2190863625,0.1494513491,0.0666713443};
xm=0.5*(b_arg+a_arg);
xr=0.5*(b_arg-a_arg);
s=0;
for (j=1;j<=5;j++) {
dx=xr*x[j];
s += w[j]*((obj->*fun)(xm+dx)+(obj->*fun)(xm-dx));
}
return s *= xr;
}



int main()
{
Test hello;
hello.x=1;

double result=qgaus(&hello, Test::square, 0, 1); // 这里 hello.square 可以
result = qgaus(&hello, Test::add, 0, 1);

Test hello2;
hello2.x = 2;
result = qgaus(&hello2, Test::square, 0, 1);
result = qgaus(&hello2, Test::add, 0, 1);
return 0;
}

这程序我用 Test::square 或 hello.square 得到的 member function pointer 都是一样的值, 由此证明 member function pointer 並沒有跟实体合在一起, 必需在使用时跟实体一起使用, 如程序里的 (obj->*fun)(xm+dx)

所以如果要用 for_each(.., .., ..) 的话, 可能要使用一些其他的技巧才能实现, 因为 for_each 看來是要接受真实地址的
crazy_lazy_pig 2006-08-10
  • 打赏
  • 举报
回复
不行啊?那我就没办法了。

不过查了一下,找到个STL箴言之类的东西:http://stl.winterxy.com/html/item_41.html
那上面就这么用的。

也许是VC的缘故吧,VC对标准的支持实在太差,我曾经有过这种经历,完全一样的代码,到VC上就给我罢工,没办法,逼我换了GCC。
bluetide 2006-08-10
  • 打赏
  • 举报
回复
mem_fun(&CMyView::show)肯定是不行的,行我就不上来问了
crazy_lazy_pig 2006-08-10
  • 打赏
  • 举报
回复
应该就用mem_fun, 似乎也有简单的直接用的办法:
mem_fun(&CMyView::show)
记不太清楚,手头也没有编译器,楼主自己多试试,或者网上查查,应该很简单的。总之,直接用CMyview::show是不行的。
genius_hb 2006-08-10
  • 打赏
  • 举报
回复
指向成员的指针不是通常意义上的指针。你可以按cunsh(村少) 说的,将成员函数定义为静态的。
bluetide 2006-08-10
  • 打赏
  • 举报
回复
还是没有人能解决吗?
bluetide 2006-08-10
  • 打赏
  • 举报
回复
to foochow(恰似你的温柔):

考虑到程序的移植性,不打算使用boost库,尽管boost其实已经是stl标准委员会的钦定实现版:)
foochow 2006-08-10
  • 打赏
  • 举报
回复
boost

for_each(vd.vecpe.begin(), vd.vecpe.end(),bind(&CMyView::show,this,_1));
bluetide 2006-08-10
  • 打赏
  • 举报
回复
to Muf(沐枫):
bind1st(mem_fun<void, CMyView, Element*>(&CMyView::show), &a));
mem_fun的模板参数怎么是3个啊(明明是两个嘛),编译都没法通过:
error C2563: mismatch in formal parameter list
bluetide 2006-08-10
  • 打赏
  • 举报
回复
将show改为static的确可以解决,但是由于我的show需要根据this所指的对象的信息作绘画动作,所以在这里static不能解决问题。

zdleek 2006-08-10
  • 打赏
  • 举报
回复
for_each()这种东西没用过
Ejnstein 2006-08-10
  • 打赏
  • 举报
回复
Fix1:
class CMyView : public CView
{
public:
static void show(Element* pe)
___________________________________________________________________________________
Fix2:
for_each(vd.vecpe.begin(), vd.vecpe.end(),this->show);
ddstudent 2006-08-10
  • 打赏
  • 举报
回复
改成这样可以 compile 通过

void CMyView::showAll()
{
using namespace std;
void (CMyView::*fn)(Element *);
fn = &CMyView::show;
for_each(vd.vecpe.begin(), vd.vecpe.end(), this->*fn);
}
ddstudent 2006-08-10
  • 打赏
  • 举报
回复
试试把
for_each(vd.vecpe.begin(), vd.vecpe.end(),&CMyView::show);
改成
for_each(vd.vecpe.begin(), vd.vecpe.end(),this->show);

this 才是实体
foochow 2006-08-10
  • 打赏
  • 举报
回复
那自己传个this..
class CMyView:public CView
{
public:
struct show:public binary_function<CMyView*,Element*,bool>
{
bool operator()(CMyView*p,Element pe)const
{

}
};
void showAll();
private:
ViewData vd;
};
void CMyView::showAll()
{
for_each(vd.vecpe.begin(),vd.vecpe.end(),bind1st(CMyView::show(),this));
}
lkpo 2006-08-09
  • 打赏
  • 举报
回复
将show改成静态的
Muf 2006-08-09
  • 打赏
  • 举报
回复
实在对不起啊。要结合bind1st和mem_fun.
下面的代码我测过了。
#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;

struct Element
{
int a;
};

class CMyView
{
public:
void show(Element* p)
{
}
};

vector<Element*> v;

int _tmain(int argc, _TCHAR* argv[])
{
CMyView a;

for_each(v.begin(), v.end(), bind1st(mem_fun<void, CMyView, Element*>(&CMyView::show), &a));
return 0;
}

加载更多回复(7)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧