2014-01-27 38 views
-1

錯誤當初始化函數指針給出下面的結構與文件名和functionpointer結構成員

static struct thread { 
    const char *const filename; 
    ssize_t (*in)(struct thread *, void *, size_t); 

} 

和功能

int MyClass::read_wrap(struct stThread *t, void *buf, size_t nbytes) 
{ 
    return read(t->fd, buf, nbytes); 
} 

我試着功能read_wrap分配給結構對象中的函數指針成員:

int main (void) 
{ 

thread myThread; 
myThread.in = read_wrap; 

} 

但是我得到t他錯誤:

error: cannot convert MyClass::read_wrap’ from type ‘int (MyClass::)(stThread*, void*, size_t) {aka int (MyClass::)(stThread*, void*, unsigned int)}’ to type ‘int (*)(MyClass*, void*, size_t) {aka int (*)(stThread*, void*, unsigned int)}’ 

我的意思是,該結構是期待一個函數指針,我想,當我將它傳遞函數的名稱,這是莫名其妙地鑄造成FP? 這段代碼來自C語言,使用gcc進行編譯。 感謝您的幫助!

+0

的T-> FD功能是成員函數類型,這是不同的只是一個函數指針 – zapredelom

回答

1

成員函數指針與普通函數指針有不同的類型。正如你可以從錯誤中看到,一個成員函數指針read_wrap的類型實際上是:

int (MyClass::*)(stThread*, void*, size_t) 

的重要組成部分,是MyClass::這使得它與普通函數指針不兼容。必須在MyClass的某個實例上調用該成員函數指針。

但是,由於您的read_wrap函數似乎沒有使用MyClass的任何非靜態成員,所以沒有理由將其作爲非靜態成員函數。要麼使它成爲一個自由函數,要麼使它成爲一個靜態成員,並且你的錯誤將會消失。

0

您正在初始化一個具有非靜態成員函數地址(type ‘int (MyClass::)(stThread*, void*, size_t) {aka int (MyClass::)(stThread*, void*, unsigned int)}’)的未綁定函數ordinary function指針(type ‘int (*)(MyClass*, void*, size_t) {aka int (*)(stThread*, void*, unsigned int)}’)。您的聲明類型需要更改以符合您的初始化值。

嘗試改變

ssize_t (*in)(struct thread *, void *, size_t); 

ssize_t (MyClass::*in)(struct thread *, void *, size_t); 
+0

如果你做出的改變,你也需要以某種方式提供一個'MyClass'對象來調用成員函數。由於函數不訪問任何類成員,因此使其成爲靜態或非成員可能是更好的選擇。 –

+0

@MikeSeymour:我相信,OP問題只是一個更大問題的簡化版本。所以假設'該函數不訪問任何類成員',可能不正確。但是任何情況下,都要根據用例選擇OP。是的,你提到的是一個設計問題。如果一個函數足夠小而不能訪問任何類成員,它應該是非成員函數。該問題的函數指針部分在該場景中稍後。如果您不這麼想,請告訴我。 – Abhijit