C++ struct 的构造函数与一个函数名冲突,如何解决?

2016-05-07 20:26:52 +08:00
 neoblackcap

目前在用 C++写一个网络程序,在调用 kevent 的时候发现跟 kevent 结构的构造函数冲突了。 试过很多方法,比如 typedef 什么的,但是就是无法分清 kevent 函数跟 kevent 结构的构造函数啊。 我想要的是调用 kevent 函数不是 kevent 结构的构造函数

kevent(event_loop_fd_, change_list.data(), 1,
       event_list.data(), 1, NULL, &timeout_struct); // return int, good
kevent(event_loop_fd_, change_list.data(), 1,
       event_list.data(), 1, NULL, &timeout_struct); // return kevent instance, bad
2004 次点击
所在节点    C
9 条回复
scream7
2016-05-07 20:32:02 +08:00
用 namespace ?
neoblackcap
2016-05-07 20:35:20 +08:00
@scream7 不行吧,因为 kevent 是来自系统的头文件,那是 C 的 API ,一 include 就是全局的了,没有 namespace
limhiaoing
2016-05-07 20:39:24 +08:00
&::timeout_struct
neoblackcap
2016-05-07 20:43:15 +08:00
@limhiaoing 我不是 timeout_struct 这有问题啊,我是 kevent 这个名字有问题啊,内核既有这样名字的函数,也有这样名字的 struct ,一用 C++就爆炸了, C++直接将 kevent()当构造函数了
neoblackcap
2016-05-07 20:50:43 +08:00
已经解决,原来是我的函数签名不对,我输入了 7 个参数,只要输入 6 个参数就能正确调用了。
owt5008137
2016-05-07 22:53:35 +08:00
如果有重载 6 个参数的构造函数的话,用::kevent 也可以强制指定用顶层的函数
neoblackcap
2016-05-07 23:30:17 +08:00
@owt5008137 并没有重载,主要就是函数是 C 的函数,而结构也是 C 的结构,但是换成 C++之后因为 struct 就是 class ,因此就多了个 constructor 出来,至于::kevent 的方法我就没有试。这样的例子实在太罕见了。
billlee
2016-05-07 23:37:59 +08:00
实际上,类似歧义是真的有的,但是应该默认是调用函数,可以用 {} 代替 () 来构造对象。
owt5008137
2016-05-07 23:41:08 +08:00
@neoblackcap 这个情况其实挺常见的,因为 C++的名字搜索规则比较复杂,有很多情况会导入其他命名空间或者域的类名或者函数名。特别是引用不同的库和模块或者库之间嵌套使用的时候。所以很多库,特别是模板函数里的调用都是会加::的完整前缀的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/277022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX