我正在尝试将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套接字库,但是我对write函数的定义似乎正在影响它。如果我将类定义函数的名称更改为其他名称,那么一切似乎都能正常工作。
我有理由相信更改我的函数名称将是我的最终解决方案,但有人可以告诉我导致此行为的C ++命名规则的名称吗?我想读一读,所以我知道将来我在做什么。
答案 0 :(得分:6)
您是否尝试过调用C函数来解释它是否存在于全局命名空间中,例如:: write?
答案 1 :(得分:2)
This page在描述C ++中的名称查找规则方面做得非常好。基本上,一旦编译器看到write()
是类成员函数,它就不会查找同名的全局函数。然后报告错误,因为成员函数write()
没有正确的数量和类型的参数,就像你给它的那样。使用一元范围解析运算符::
会强制编译器仅在全局命名空间中搜索名为write()
的函数,然后成功。
答案 2 :(得分:1)
更一般地说,当编译器寻找函数时,它首先查找最近的命名空间,如果找到具有正确名称的命名空间,即使签名不匹配,它也不会再查找。