13

我正在使用新的 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(). 对此的任何想法将不胜感激。

谢谢

罗马

4

1 回答 1

37

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

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

但是,如果您using namespace std;在程序中编写代码,那么您将面临像这样的潜在重大变化,因为 free 函数bind和函数std::bind不一定能消除歧义。

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

希望这可以帮助!

于 2012-04-05T20:23:30.030 回答