2

我正在尝试将 C 套接字库中的一些函数封装到我自己的 C++ 类中。我想定义一个成员函数,它使用与其对应的 C 函数相同的名称,但具有不同的签名。例如,我想编写函数

ssize_t MyClass::write(const void *buf);

调用

ssize_t write(int fd, const void *buf, size_t count);

编译时出现以下错误

error: no matching function for call to ‘MyClass::write(int&, const char*&, size_t)’
note: candidates are: ssize_t MyClass::write(const char*)

我有正确的#include语句来调用 C 套接字库,但我对写入函数的定义似乎掩盖了它。如果我将类定义函数的名称更改为其他名称,一切似乎都正常。

我有理由确定更改我的函数名称将是我的最终解决方案,但是有人可以告诉我导致这种行为的 C++ 命名规则的名称吗?我想阅读它,以便我知道我将来会做什么。

4

3 回答 3

6

您是否尝试过调用 C 函数以明确表示它位于全局命名空间中,例如 ::write?

于 2009-02-10T16:35:22.863 回答
2

这个页面很好地描述了 C++ 中的名称查找规则。基本上,一旦编译器看到这write()是一个类成员函数,它就不会寻找同名的全局函数。然后它报告一个错误,因为成员函数write()没有你给它的正确数量和类型的参数。一元范围解析运算符的使用::强制编译器仅在全局命名空间中搜索名为 的函数write(),然后搜索成功。

于 2009-02-10T17:51:49.310 回答
1

更一般地,当编译器去寻找一个函数时,它首先在最近的命名空间中寻找,如果它找到一个具有正确名称的名字,它就不会再寻找任何东西,即使签名不匹配。

于 2009-02-10T17:45:21.167 回答