编译使用 libcxx 的套接字函数 bind() 的代码失败

Compiling code that uses socket function bind() with libcxx fails

本文关键字:代码 失败 bind 套接字 libcxx 编译 函数      更新时间:2023-10-16

我正在使用新的libcxx库,并且我有一个调用套接字函数bind()的代码。问题是,当我键入using namespace std;编译器时,会为以下代码提供错误:

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));

使用 clang (svn 构建)的错误:

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int'
 int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));

我认为问题在于using namespace std;将函数std::bind()从标头<functional>带到范围(尽管不包括标头)。由于我使用的是使用整个命名空间 std 的第三方库,因此我无法轻松地将类名更改为完全限定名。

我想知道这是否是库实现中的问题,或者 C++11 中是否有一些新规则可能会破坏使用 bind() 的旧代码。对此的任何想法将不胜感激。

谢谢

罗马

这在库的实现中不是问题。 C++11在namespace std中引入了自己的std::bind函数,用于将参数绑定到函数并支持一些高阶编程。

之所以具有namespace std,是为了帮助防止新的库函数和类导致现有代码中的中断性更改。 这样做的原因是所有东西都有一个以 std:: 开头的名称,这可以防止名称冲突。

但是,如果您在程序中编写using namespace std;,则会面临像这样的潜在中断性更改,因为 free 函数bind和函数std::bind不一定可以消除歧义。

若要解决此问题,可以调用 bind 作为::bind以明确它位于全局命名空间中,也可以删除程序顶部的using namespace std;

希望这有帮助!