有关临时"函数对象"的问题

RocWay007 2009-06-25 12:30:13
在下面的程序中,我使用函数对象适配器unary_negate适配logical_not,可是在链接时出现了一个莫名其妙的错误。请达人看一下为什么。
unary_negate<logical_not<bool> > neg( logical_not<bool>() );
neg( false );

在DEV-C++中编译时提示如下的链接错误:
[Linker error] undefined reference to `neg(std::logical_not<bool> (*)())'

这是为什么呢?
...全文
28 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
RocWay007 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 yshuise 的回复:]
unary_negate <logical_not <bool> > neg( logical_not <bool>() );
neg是什么东西?
从你的编译错误来看,显然没有把logical_not <bool>() 当作函数对象,而是函数指针了。
代码太少了。unary_negate类贴出来吧,否则只能猜了。
[/Quote]


unary_negate是标准STL函数对象适配器。

不过,上面两位,chao_83和yshuise你们都猜对了。的确是在定义变量neg时导致了二义性:
unary_negate <logical_not <bool> > neg( logical_not <bool>() );
在上述定义中,我的本意是定义一个neg变量,没想到编译器竟将其当做了一个函数声明。
logical_not <bool>()没有被当作一个临时对象,而是当成一个返回logical_not<bool>对象的函数指针。

上述两位正解。
yshuise 2009-06-25
  • 打赏
  • 举报
回复
unary_negate <logical_not <bool> > neg( logical_not <bool>() );
neg是什么东西?
从你的编译错误来看,显然没有把logical_not <bool>() 当作函数对象,而是函数指针了。
代码太少了。unary_negate类贴出来吧,否则只能猜了。
chao_83 2009-06-25
  • 打赏
  • 举报
回复
我想我明白原因了。
logical_not <bool>() 是函数指针定义,等价与:
logical_not <bool>(*)()
RocWay007 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yshuise 的回复:]
引用 9 楼 pc_fly 的回复:

引用 8 楼 yshuise 的回复:
我使用函数对象适配器unary_negate适配logical_not

怎么适配的?是不是这儿写错了?


适配的过程很简单,只要将logical_not作为unary_negate的模板参数(实参)即可。如下所示:
unary_negate  <logical_not <bool> >

那 你写operator()操作没有?

[/Quote]

这两个函数对象都是标准STL中已经定义好的,operator()自然是有的。
RocWay007 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chao_83 的回复:]
仔细看了一下定义,楼主的逻辑是正确的。
似乎是因为 logical_not <bool>()是临时对象。
logical_not <bool> lb;
用lb初始化neg就行了。
晕,不知道原因。
neg应该是保持副本啊,难道只保留引用。
[/Quote]

在unary_negate的定义中,有一个保护的成员变量,该成员变量用来保存构造时传入的函数对象:

protected:
_Predicate _M_pred;
public:
explicit
unary_negate(const _Predicate& __x) : _M_pred(__x) {}

yshuise 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pc_fly 的回复:]
引用 8 楼 yshuise 的回复:
我使用函数对象适配器unary_negate适配logical_not

怎么适配的?是不是这儿写错了?


适配的过程很简单,只要将logical_not作为unary_negate的模板参数(实参)即可。如下所示:
unary_negate <logical_not <bool> >
[/Quote]
那 你写operator()操作没有?
RocWay007 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yshuise 的回复:]
我使用函数对象适配器unary_negate适配logical_not

怎么适配的?是不是这儿写错了?
[/Quote]

适配的过程很简单,只要将logical_not作为unary_negate的模板参数(实参)即可。如下所示:
unary_negate <logical_not<bool> >
yshuise 2009-06-25
  • 打赏
  • 举报
回复
我使用函数对象适配器unary_negate适配logical_not

怎么适配的?是不是这儿写错了?
chao_83 2009-06-25
  • 打赏
  • 举报
回复
仔细看了一下定义,楼主的逻辑是正确的。
似乎是因为 logical_not <bool>()是临时对象。
logical_not <bool> lb;
用lb初始化neg就行了。
晕,不知道原因。
neg应该是保持副本啊,难道只保留引用。
RocWay007 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yshuise 的回复:]
代码贴全。。
[/Quote]

在主函数中就是这两行代码,外加一个return语句。
yshuise 2009-06-25
  • 打赏
  • 举报
回复
代码贴全。。
RocWay007 2009-06-25
  • 打赏
  • 举报
回复
使用函数对象适配器unary_negate适配logical_not,生成新的函数对象,其变量为neg。
neg接收的参数类型应当是logical_not的模板实参,也就是这里的bool。
可为什这里要提示undefined reference to `neg(std::logical_not <bool> (*)())' ???
chao_83 2009-06-25
  • 打赏
  • 举报
回复
logical_not <bool>事函数对象,所以neg的operator()需要函数对象做参数吧
chao_83 2009-06-25
  • 打赏
  • 举报
回复
不好意思,没注意<bool>后的()。
chao_83 2009-06-25
  • 打赏
  • 举报
回复
不太懂,
我的理解:lz声明了一个neg函数,但是没有函数体的定义。

64,649

社区成员

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

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