2

我试图通过一个项目来熟悉 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)

那么我做错了什么?我不能合法地从方法中调用这个函数吗?

4

5 回答 5

6

大概您想调用write(2)位于全局命名空间中的 :

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

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

于 2012-11-24T20:36:02.517 回答
0

看起来编译器不知道全局write函数。您是否包含了正确的标题(<unistd.h>在 unix 中)?(而且,那个(void *)演员是没用的。)

于 2012-11-24T20:35:56.157 回答
0

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

于 2012-11-24T20:36:53.950 回答
0

编译器认为 write 是你的类方法,它不是。如果您正在谈论系统调用 write 您应该 #include unistd.h 并使用 ::write(filedes, (void *)str.c_str(), str.length());

于 2012-11-24T20:37:06.820 回答
0

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

于 2012-11-24T20:48:45.750 回答