【问题标题】:libc++ - naming conflict for bind()?libc++ - bind() 的命名冲突?
【发布时间】:2012-01-24 00:02:44
【问题描述】:

经过令人惊讶的少量修改后,我设法在我的 Linux 机器上安装了 libc++(因为 libstdc++ 缺少一些东西)。不幸的是,由于具有相同名称的函数,我现有的一些代码现在已经损坏。

通常,按照我需要的方式,bind() 与套接字相关。然而,libc++ 自带了自己的 bind() 函数,基本上是this,但没有方便的命名空间来分隔它们。根据墨菲定律,编译器尝试使用错误的函数,并吐出错误。 NetBeans 没有发现任何问题,因为它实际上是在 sys/socket.h 文件中查找,它应该这样做。

那么,这两个函数基本上都超出了我的控制范围,我如何告诉编译器 (clang++) 它应该在特定的头文件中查找,而不是在其他地方查找该函数?

【问题讨论】:

  • 给出一些上下文,例如您的顺序包括目录和链接顺序。这个错误发生在什么阶段?
  • @honk 我现在已经尝试了目录顺序和链接顺序的每一种排列,可能会解决它。没有运气。据我所知,“-stdlib=libc++”编译器选项优先于我可以在文件中设置的任何内容。
  • libc++ 的 bind() 位于 std 命名空间中。 Socket 的bind() 应该在全局命名空间中。你在任何地方使用using namespace std; 吗?

标签: c++ clang libc++


【解决方案1】:

我在来自<WinSock2.h>bind()std::bind() 之间存在冲突(我使用的是using namespace std;
我刚刚在方法调用之前添加了::,它起作用了! bind() => ::bind()

【讨论】:

  • 我遇到了同样的问题。我遵循了你的指导方针。有用。谢谢
【解决方案2】:

首先,这与墨菲无关,我认为:bind() 模板的选择可能只是更好的匹配。 std::bind() 的声明在命名空间 std 中,但是,至少在我正在查看的头文件的版本中。您的源文件是否可能包含 using 指令? (在这种情况下,你应该得到你所要求的所有痛苦)

如果没有 using 指令,如果参数匹配完全,非模板版本应该是更好的匹配。如果这仍然没有帮助,您可以从<sys/socket.h>bind() 函数创建一个转发函数,假设avoid_conflict_bind() 这是翻译单元中定义的唯一函数,即它只包括<sys/socket.h> 和不是<functional>。这样就没有选择此函数转发到的bind() 函数,然后您可以使用avoid_conflict_bind()

【讨论】:

  • 我的所有源文件中确实有using namespace std;,因为太多依赖于此。我将尝试在其范围之外添加一个重定向 bind() 的函数。
  • 就个人而言,我宁愿从所有源文件中删除 using 指令,但这个选择是你的。由于我自己没有 using 指令,我对此有点模糊,但我认为 using ::bind() 不使用通过 using 指令导入的名称。这可能会简单一些。但是,我强烈建议不要使用指令!它只是让人不清楚功能的来源。我在任何地方都使用显式限定(通常使用命名空间别名):直接查看声明所指的内容。
  • @DigitalMan:我赞同 Dietmar Kuhl 对 using namespace xxx; 的看法。您有几个替代方案:1. 完全限定类型(函数应该由 ADL 选择),2. 使用 typedef 用于经常使用的类型,3. 将经常使用的类型(或函数)带入目标 @ 987654335@(例如),4. 为冗长的命名空间 namespace phx = boost::phoenix; 使用命名空间别名。请记住,通常情况下,您应该尽量缩小符号范围。
  • 现在好了。我看了很多遍,似乎普遍认为,一旦“使用”到位,就无法在该代码块中避免它。但是,你瞧,::bind() 正是做到了这一点。使用一个 '::' 肯定比在别处使用一百个 'std::' 好。
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多