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を使用する必要があります。他のコードに含まれている場合は、必ずexternを配置し、ヘッダーまたは関数を実装するコードを使用してください。

于 2012-11-24T20:48:45.750 に答える
0

コンパイラがグローバルwrite関数を認識していないようです。正しいヘッダーを含めましたか ( <unistd.h>unix の場合)? (また、その(void *)キャストは役に立たない。)

于 2012-11-24T20:35:56.157 に答える
0

filedes は、クラスのインスタンス変数 (クラスのインスタンスではない) ではありませんが、コンパイラ エラーからわかるように、int 型のクラスのメンバーです。メソッドと同じ名前のグローバル名前空間から関数を呼び出したい場合は、::write(...) を使用します。ちなみに、長さには int ではなく std::size_t を使用してください。

于 2012-11-24T20:36:53.950 に答える
0

コンパイラは、 write がクラスメソッドであると考えていますが、そうではありません。システム コール write について話している場合は、unistd.h を #include して ::write(filedes, (void *)str.c_str(), str.length()); を使用する必要があります。

于 2012-11-24T20:37:06.820 に答える