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

Rom*_*lak 12 c++ bind c++11

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

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));
Run Code Online (Sandbox Code Playgroud)

使用clang(svn build)的错误:

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

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

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

谢谢

罗马

tem*_*def 32

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

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

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

为了解决这个问题,你可以调用bind::bind明确指出,这是在全局命名空间,也可以删除using namespace std;该程序的顶部.

希望这可以帮助!