2013-01-24 47 views
1
#define UCHAR unsigned char 

typedef bool (*FUNC)(UCHAR uc1, UCHAR uc2); 
typedef void(*PF)(FUNC, UCHAR*); 
PF Assign; 

class Class { 
    private: 
     UCHAR buf[32]; 
     bool func(UCHAR c1, UCHAR c2) { } 

    public: 
     Class::Class(void) { 
      Assign(func, buf);   // <<< Microsoft VC++ error C3867 
     } 

     Class::~Class() { } 
}; 

error C3867: 'Class::func': function call missing argument list; use '&Class::func' to create a pointer to member的Visual C++錯誤C3867和C2664

如果我嘗試了上述

Assign(&Class::func, buf); // <<< Microsoft VC++ error C2664

錯誤消息的建議,我得到這個錯誤:

error C2664: 'void (FUNC,unsigned char *)' : cannot convert parameter 1 from 'bool (__thiscall Class::*)(unsigned char,unsigned char)' to 'FUNC' There is no context in which this conversion is possible

在不改變任何東西怎麼能我得到這個Assign()函數來編譯? 這些類型定義來自我需要接口的庫。

+0

永遠不要這樣做:'#定義UCHAR無符號char' - 始終使用一個typedef,例如'typedef unsigned char UCHAR;' –

回答

1

func是一個非靜態成員函數,所以它的類型爲bool (Class::*)(UCHAR, UCHAR),而Assign需要bool (*)(UCHAR, UCHAR)。您不能將非靜態成員函數轉換爲非成員函數。

爲了能夠通過funcAssign,您必須使func靜態。

1

類型別名FUNCPF不是成員函數指針,只能用於指向靜態成員函數。原因是所有非靜態成員函數都有指針this的隱式第一個參數。

如果需要通用功能「指針」你應該看看std::function

typedef std::function<bool(UCHAR uc1, UCHAR uc2)> FUNC; 
typedef std::function<void(FUNC, UCHAR*)> PF; 
PF Assign; 

Class::Class(void) { 
    Assign(std::bind(&Class::func, *this), buf); 
} 
+0

但是我不能修改第三部分庫typedefs和PF Assign;線。如果我使func靜態,那麼我無法訪問類變量。我得到這個錯誤:錯誤C2597:對非靜態成員'Class :: buf'的非法引用 – user292344

+0

@ user292344如果'FUNC'和'PF'類型是第三方庫的一部分,則應該在問題中聲明。如果是這種情況,那麼你需要重新考慮你的設計。 –