当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : stl中的函数对象的问题,求解!!!
帖子发表于 : 2008-03-25 10:58 

注册: 2008-01-06 19:58
帖子: 11
送出感谢: 0 次
接收感谢: 0 次
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

struct Sub : public unary_function<int,void>
{
void operator() (int & ri)
{
ri -= 5;
}
};

int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
copy(a,a+10,ostream_iterator<int>(cout," ");
cout << endl;

for_each(a,a+10,Sub());

copy(a,a+10,ostream_iterator<int>(cout," ");
cout << endl;
return 0
}
以上代码用g++编译通过,豪无问题

#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <set>
using namespace std;

struct check_unary: public unary_function<int,void>{
void operator()(int& i){
i -= 5;
}
};

int main(){
set<int> c;
for(int i =0; i < 10; ++i)
c.insert(i);

for(set<int>::const_iterator pos = c.begin(); pos != c.end(); ++pos)
cout<< *pos<<' ';
cout<<endl;

for_each(c.begin(), c.end(), check_unary());

for(set<int>::const_iterator pos = c.begin(); pos != c.end(); ++pos)
cout<< *pos<<' ';
cout<<endl;

return 0;
}
但我将数组换成容器后就编译通不过了
报错为:
myfuc_practice.cpp:41: instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:159:
error: no match for call to ‘(check_unary) (const int&’
myfuc_practice.cpp:27: note: candidates are: void check_unary:perator()(int&

才学stl的新手
求解!!!!!!
谢谢!!!!!


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-03-28 19:37 

注册: 2007-11-12 18:28
帖子: 2
送出感谢: 0 次
接收感谢: 0 次
for_each(c.begin(), c.end(), check_unary());
是不是这一行有问题,你可一修改一下修改成
for_each(c.begin(), c.end(), check_unary()());
^^^^^^^^^^^^^^^^^^^
看看对不对。


页首
 用户资料  
 
3 楼 
 文章标题 : Re: stl中的函数对象的问题,求解!!!
帖子发表于 : 2008-03-29 10:58 
头像

注册: 2007-07-12 16:30
帖子: 303
地址: 桂林
送出感谢: 0 次
接收感谢: 2
nick811125 写道:
return 0
}
以上代码用g++编译通过,豪无问题

明显少了个分号,还能过,神!
代码:
error: no match for call to ‘(check_unary) (const int&’
myfuc_practice.cpp:27: note: candidates are: void check_unary:perator()(int&

函数check_unary:perator()需要一个整形的引用或指针(可写的),但你给它的是常量指针const int&(不可写的),当然不匹配了。
你可以把
代码:
void operator()(int& i){

改成
代码:
void operator()(int i){

编译就通过了,不过不是你要的结果。set的iterator是不可修改的,另想办法吧。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-03-29 11:22 
头像

注册: 2007-07-12 16:30
帖子: 303
地址: 桂林
送出感谢: 0 次
接收感谢: 2
deque”是相对于数组的一个不错的选择,将set改为deque即可。
代码:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <functional>
#include <deque>
using namespace std;

struct check_unary: public unary_function<int,void>{
void operator()(int& i){
i -= 5;
}
};

int main(){
deque<int> c;
for(int i =0; i < 10; ++i)
c.push_back(i);

for(deque<int>::const_iterator pos = c.begin(); pos != c.end(); ++pos)
cout<< *pos<<' ';
cout<<endl;

for_each(&c[0], &c[10], check_unary());

for(deque<int>::const_iterator pos = c.begin(); pos != c.end(); ++pos)
cout<< *pos<<' ';
cout<<endl;

return 0;
}


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译