2012-04-05 35 views
9

我正在使用新的libcxx库,并且有一个调用套接字函数bind()的代码。问题是,当我输入using namespace std;编译器让我对下面的代码中的错误:使用套接字函数bind()与libcxx编译代码失败

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

使用铛(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;将标题为<functional>的函数std::bind()带入作用域(尽管不包含标题)。由于我使用的是使用整个命名空间std的第三方库,我无法轻易将类名更改为完全限定名。

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

感谢

罗马

+0

当你说第三方库使用整个命名空间std时,你是什么意思? – Troubadour 2012-04-05 20:26:46

+0

我的意思是它在某些文件中使用了'namespace std;'。 – 2012-04-05 20:43:52

+0

大概只在源文件中,而不是在头文件中?这根本不应该影响你。 – Troubadour 2012-04-05 21:40:17

回答

27

这不是在图书馆的实施问题。 C++ 11将其自己的std::bind函数引入namespace std,该函数用于将参数绑定到函数并支持一些更高阶的编程。

具有namespace std的原因是帮助防止新库函数和类导致现有代码发生重大更改。原因是所有事物都有一个以std::开头的名称,它可以防止名称冲突。

但是,如果您在程序中编写了using namespace std;,那么您将面临潜在的重大更改,如自由功能bind和功能std::bind不一定会被消除歧义。

要解决此问题,可以拨打bind作为::bind以明确它位于全局名称空间中,或者您可以删除程序顶部的using namespace std;

希望这会有所帮助!

+0

非常感谢..它的工作很棒! – RajibTheKing 2015-11-02 13:04:17

+1

最后,我明白了绑定没有返回int是怎么回事。 – viktike 2017-03-20 19:55:58