我正在使用新的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()
的旧代码的新规则。对此有任何想法将不胜感激。
由于
罗马
答案 0 :(得分:32)
这不是库实现中的问题。 C ++ 11将自己的 std::bind
函数引入namespace std
,用于将参数绑定到函数并支持一些高阶编程。
拥有namespace std
的原因是为了帮助防止新的库函数和类在现有代码中造成重大更改。原因是所有内容都有一个以std::
开头的名称,这可以防止名称冲突。
但是,如果你在程序中编写using namespace std;
,那么你就会暴露自己可能发生的重大变化,因为自由函数bind
和函数std::bind
不能必须消除歧义。
要解决此问题,您可以将bind
调用为::bind
以明确它在全局命名空间中,或者您可以删除该程序顶部的using namespace std;
。
希望这有帮助!