【问题标题】:C++ class member function naming rulesC++类成员函数命名规则
【发布时间】:2009-02-10 16:31:40
【问题描述】:

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

【问题讨论】:

    标签: c++ naming


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-31
          • 2016-01-04
          • 1970-01-01
          • 1970-01-01
          • 2011-08-22
          相关资源
          最近更新 更多