Я пытаюсь познакомиться с 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
функция. Вы включили правильные заголовки (<unistd.h>
в unix)? (Также, что (void *)
бросок бесполезен.)
filedes — это не переменная экземпляра вашего класса (не экземпляр вашего класса), а член вашего класса с типом int, как я вижу из ошибки компилятора. Если вы хотите вызвать функцию из глобального пространства имен с тем же именем, что и у метода, используйте :: write (…). Кстати, используйте std :: size_t для длины, а не int.
Компилятор считает, что write — это ваш метод класса, и это не так. Если вы говорите о записи системного вызова, вы должны #include unistd.h и использовать :: write (filedes, (void *) str.c_str (), str.length ());
это зависит от функции записи, если это системная функция, то вы должны использовать
:: write, если это в каком-то другом коде, убедитесь, что вы поставили extern, используйте заголовок или код, который реализует функцию