编译使用 libcxx 的套接字函数 bind() 的代码失败
Compiling code that uses socket function bind() with libcxx fails
我正在使用新的libcxx库,并且我有一个调用套接字函数bind()
的代码。问题是,当我键入using namespace std;
编译器时,会为以下代码提供错误:
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr));
使用 clang (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;
将函数std::bind()
从标头<functional>
带到范围(尽管不包括标头)。由于我使用的是使用整个命名空间 std 的第三方库,因此我无法轻松地将类名更改为完全限定名。
我想知道这是否是库实现中的问题,或者 C++11 中是否有一些新规则可能会破坏使用 bind()
的旧代码。对此的任何想法将不胜感激。
谢谢
罗马
这在库的实现中不是问题。 C++11在namespace std
中引入了自己的std::bind
函数,用于将参数绑定到函数并支持一些高阶编程。
之所以具有namespace std
,是为了帮助防止新的库函数和类导致现有代码中的中断性更改。 这样做的原因是所有东西都有一个以 std::
开头的名称,这可以防止名称冲突。
但是,如果您在程序中编写using namespace std;
,则会面临像这样的潜在中断性更改,因为 free 函数bind
和函数std::bind
不一定可以消除歧义。
若要解决此问题,可以调用 bind
作为::bind
以明确它位于全局命名空间中,也可以删除程序顶部的using namespace std;
。
希望这有帮助!
相关文章:
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 链接器命令失败,macOS 上的退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- Qt:更新 QString 时自动生成的代码失败
- 使用 execv 从C++代码执行的 Linux 脚本失败
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 为什么此代码导致未处理的异常失败
- 创建进程 API 失败,在窗口 122 上出现错误代码 10
- 查找在 4 和问题中代码失败的测试用例
- 多个输入的代码失败
- MSDN 站点上调用 AdjustTokenPrivileges() 的示例代码失败,并出现"Cannot enable the SE_LOCK_MEMORY_NAME privilege"
- 将C++HelloWorld国际象棋引擎代码转换为C代码失败
- 代码失败在向量的数据之前插入数字
- 编译包含动态并行性的代码失败
- 编译使用 libcxx 的套接字函数 bind() 的代码失败
- 发布版本导致简单的protobuf代码失败
- 使用opencv调试代码失败,并出现分段错误
- 有关智能指针的代码失败
- 井字游戏代码失败