neoblackcap
V2EX  ›  C

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

  •  
  •   neoblackcap · May 7, 2016 · 2892 views
    This topic created in 3840 days ago, the information mentioned may be changed or developed.

    目前在用 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
    
    9 replies  •  2016-05-07 23:41:08 +08:00
    scream7
    scream7
    May 7, 2016
    1
    用 namespace ?
    neoblackcap
    neoblackcap
    OP
    May 7, 2016
    2
    @scream7 不行吧,因为 kevent 是来自系统的头文件,那是 C 的 API ,一 include 就是全局的了,没有 namespace
    limhiaoing
    limhiaoing
    May 7, 2016
    3
    &::timeout_struct
    neoblackcap
    neoblackcap
    OP
    May 7, 2016
    4
    @limhiaoing 我不是 timeout_struct 这有问题啊,我是 kevent 这个名字有问题啊,内核既有这样名字的函数,也有这样名字的 struct ,一用 C++就爆炸了, C++直接将 kevent()当构造函数了
    neoblackcap
    neoblackcap
    OP
    May 7, 2016
    5
    已经解决,原来是我的函数签名不对,我输入了 7 个参数,只要输入 6 个参数就能正确调用了。
    owt5008137
    owt5008137
    May 7, 2016 via Android
    6
    如果有重载 6 个参数的构造函数的话,用::kevent 也可以强制指定用顶层的函数
    neoblackcap
    neoblackcap
    OP
    May 7, 2016
    7
    @owt5008137 并没有重载,主要就是函数是 C 的函数,而结构也是 C 的结构,但是换成 C++之后因为 struct 就是 class ,因此就多了个 constructor 出来,至于::kevent 的方法我就没有试。这样的例子实在太罕见了。
    billlee
    billlee
    May 7, 2016
    8
    实际上,类似歧义是真的有的,但是应该默认是调用函数,可以用 {} 代替 () 来构造对象。
    owt5008137
    owt5008137
    May 7, 2016 via Android
    9
    @neoblackcap 这个情况其实挺常见的,因为 C++的名字搜索规则比较复杂,有很多情况会导入其他命名空间或者域的类名或者函数名。特别是引用不同的库和模块或者库之间嵌套使用的时候。所以很多库,特别是模板函数里的调用都是会加::的完整前缀的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2294 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 684ms · UTC 12:41 · PVG 20:41 · LAX 04:41 · JFK 07:41
    ♥ Do have faith in what you're doing.