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