2012-11-24 55 views
1

我試圖通過一個項目熟悉C++,但是我遇到了一個錯誤,我不太清楚如何處理。我有以下代碼:在C++類命名空間中調用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) 

那麼我做錯了什麼?我能否從法律上合法地進行此函數調用?

+0

你爲什麼要將'c_str'轉換爲void *?編譯器不會找到你想要調用的函數 – emartel

+0

write系統調用將void *作爲參數。 – Jumhyn

+3

把'::'放在'c'函數之前,以確定你想從全局命名空間得到函數......':: write(filedes,(void *)str.c_str(),str.length())' – memosdp

回答

3

大概要呼叫write(2),這是在全局命名空間:

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

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

+0

這就是我一直在尋找的!我不知道如何引用「全局命名空間」。謝謝!我可以接受你的答案。 – Jumhyn

0

它看起來像編譯器不知道全局write函數。你有沒有包含正確的頭文件(<unistd.h>在unix中)? (同樣,(void *)投是沒用的。)

+0

這沒關係。名稱查找的方式意味着首先找到成員函數,並且搜索停在那裏。 – bames53

0

filedes不是你的類的實例變量(不是你的類的實例),而是類型爲int的類的成員,正如我從編譯器錯誤中看到的那樣。如果你想從一個全局名字空間中調用一個與那裏的方法同名的函數,使用:: write(...)。順便說一下:使用std :: size_t來表示長度,而不是int。

0

編譯器認爲寫是你的類方法,它不是。如果您正在討論系統調用寫入,您應該#include unistd.h並使用:: write(filedes,(void *)str.c_str(),str.length());

0

它取決於什麼是寫入功能,如果它是一個系統功能,那麼你必須使用 ::寫入,如果它在其他代碼中請確保你放入extern,使用頭或實現該函數的代碼