2017-04-07 104 views
-2

我試圖包括用C庫中的功能的結構的++參數不相容。參數類型的「常量[structname] *」是與類型「常量[structname] *」

的結構是這樣的:

struct NET_IN_OPERATE_FACERECONGNITIONDB{ 
DWORD        dwSize; 
EM_OPERATE_FACERECONGNITIONDB_TYPE emOperateType; 
FACERECOGNITION_PERSON_INFO  stPersonInfo; 
char        *pBuffer; 
int        nBufferLen; 
};            ` 

和它包含的功能是這樣的:

BOOL CLIENT_OperateFaceRecognitionDB(
LLONG        lLoginID, 
const NET_IN_OPERATE_FACERECONGNITIONDB  *pstInParam, 
NET_OUT_OPERATE_FACERECONGNITIONDB  *pstOutParam, 
int         nWaitTime = 1000, 
); 

我寫了下面幾行定義結構的指針:

const struct NET_OUT_OPERATE_FACERECONGNITIONDB{ 
    DWORD        dwSize = sizeof(NET_IN_OPERATE_FACERECONGNITIONDB); 
    EM_OPERATE_FACERECONGNITIONDB_TYPE emOperateType = NET_FACERECONGNITIONDB_ADD; 
    FACERECOGNITION_PERSON_INFO  FACERECOGNITION_PERSON_INFO1; 
    char        *pBuffer = '\0'; 
    int        nBufferLen = 10; 
} *pstInParam; 

但是當我使用這一行將該結構調用到函數中時:

CLIENT_OperateFaceRecognitionDB(m_LoginID, pstInParam, pstOutParam, 1000); 

我收到一個錯誤說

參數類型的「常量NET_IN_OPERATE_FACERECONGNITIONDB *」是不符合類型的參數「常量NET_IN_OPERATE_FACERECONGNITIONDB *」

這是非常不尋常的,因爲無論是參數和參數是相同的類型。我做了什麼錯誤?

+0

跆拳道是「結構的指針」? –

+0

您的'pstInParam'定義看起來很奇怪。這是一個指針,但你想分配'NET_OUT_OPERATE_FACERECONGNITIONDB'成員被指向的實際上不保留該結構的任何記憶。 –

回答

1

這是非常不尋常的,因爲參數和參數都是相同的類型。

它們不是相同的類型(錯誤消息告訴你,雖然它不是很有幫助)。

這是怎麼回事是你的pstInParam聲明實際上是定義一個匿名struct,然後引入一個變量,它是一個指向這個匿名struct

這更容易看到在減少的例子,這yields a more helpful error最近版本的GCC:

struct some_struct { 
    int member; 
}; 

bool some_function(const some_struct*) { 
return false; 
} 

int main() 
{ 
    const struct some_struct { 
    int member = 0; 
    } *param; 

    some_function(param); 
} 
prog.cc: In function 'int main()': 
prog.cc:15:22: error: cannot convert 'const main()::some_struct*' to 'const some_struct*' for argument '1' to 'bool some_function(const some_struct*)' 
    some_function(param) 

你(也許,這取決於CLIENT_OperateFaceRecognitionDB所有權語義)想要什麼做的是要麼聲明some_struct,並將其地址傳遞給函數:

int main() 
{ 
    const some_struct param{0}; 
    some_function(&param); 
} 

...或分配它的自由存儲區:

int main() 
{ 
    const some_struct* param = new some_struct{0}; 
    some_function(param); 
    delete param; 
} 

在後一種情況下,請考慮是否可以利用智能指針。