C ++类成员函数命名规则

时间:2009-02-10 16:31:41

标签: c++ naming

我正在尝试将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 ++命名规则的名称吗?我想读一读,所以我知道将来我在做什么。

3 个答案:

答案 0 :(得分:6)

您是否尝试过调用C函数来解释它是否存在于全局命名空间中,例如:: write?

答案 1 :(得分:2)

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

答案 2 :(得分:1)

更一般地说,当编译器寻找函数时,它首先查找最近的命名空间,如果找到具有正确名称的命名空间,即使签名不匹配,它也不会再查找。