V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
neoblackcap
V2EX  ›  C

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

  •  
  •   neoblackcap · 2016-05-07 20:26:52 +08:00 · 1994 次点击
    这是一个创建于 3122 天前的主题,其中的信息可能已经有所发展或是发生改变。

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