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

时间:2012-04-05 20:10:28

标签: c++ c++11 bind

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

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

使用clang(svn build)的错误:

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()的旧代码的新规则。对此有任何想法将不胜感激。

由于

罗马

1 个答案:

答案 0 :(得分:32)

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

拥有namespace std的原因是为了帮助防止新的库函数和类在现有代码中造成重大更改。原因是所有内容都有一个以std::开头的名称,这可以防止名称冲突。

但是,如果你在程序中编写using namespace std;,那么你就会暴露自己可能发生的重大变化,因为自由函数bind和函数std::bind不能必须消除歧义。

要解决此问题,您可以将bind调用为::bind以明确它在全局命名空间中,或者您可以删除该程序顶部的using namespace std;

希望这有帮助!