类命名空间中的 C 函数调用C++

C function calls in C++ class namespace

本文关键字:函数调用 C++ 命名空间      更新时间:2023-10-16

我试图通过一个项目来熟悉C++,但我遇到了一个我不太确定如何处理的错误。我有以下代码:

void myclass::write(std::string str) {
  write(filedes, (void *)str.c_str(), str.length());
}

其中 filedes 是 myclass 的实例变量。尝试编译此操作会产生错误:

myclass.cpp: In member function ‘void myclass::write(std::string)’:
myclass.cpp:38: error: no matching function for call to ‘myclass::write(int&, void*, size_t)’
myclass.cpp:37: note: candidates are: void myclass::write(std::string)
myclass.hpp:15: note:                 void myclass::write(std::string, int)

那我做错了什么呢?我可以合法地从方法进行此函数调用吗?

大概你想调用 write(2) ,它在全局命名空间中:

::write(filedes, str.c_str(), str.length());

(您可能需要#include <unistd.h>)。

看起来编译器不知道全局write函数。您是否包含正确的标头(在 unix 中<unistd.h>)?(另外,(void *)演员表是没有用的。

filedes 不是类的实例变量(不是类的实例),而是类型为 int 的类的成员,正如我从编译器错误中看到的那样。如果要从与那里的方法同名的全局命名空间调用函数,请使用 ::write(...)。顺便说一下:使用 std::size_t 表示长度,而不是 int。

编译器

认为write是你的类方法,但事实并非如此。如果你在谈论系统调用写入,你应该 #include unistd.h并使用::write(filedes, (void *)str.c_str(), str.length());

这取决于写入函数是什么,如果它是一个系统函数,那么你必须使用::write ,如果它是在其他代码中,请确保输入 extern,使用标头或实现函数的代码