VS編譯錯誤:“到內建型別的函式樣式轉換隻能接受一個引數”解決方案
阿新 • • 發佈:2019-02-08
呼叫DLL中的函式,按著基本的步驟來寫的最後編譯時,報錯“到內建型別的函式樣式轉換隻能接受一個引數”,網上搜了下,也沒有看到有用的解決方案。
我的程式碼是這樣的,呼叫LZMA的壓縮函式,壓縮檔案:
沒有搜到解決方案就只能排查程式碼了,報錯的程式碼行是:HMODULE hModule = LoadLibrary(L"LZMA.dll"); if ( NULL == hModule ) { cout<<"沒有找到LZMA.dll"<<endl; return 0; } LzmaCompress pLzmaCom = (LzmaCompress)GetProcAddress(hModule, "LzmaCompress"); if ( pLzmaCom ) { FILE* fp = fopen("c:\\1.jpg", "rb"); if ( NULL != fp ) { fseek(fp, 0, SEEK_END); size_t nSrcLen = ftell(fp); fseek(fp, 0, SEEK_SET); byte* pSrcData = (byte*)malloc(nSrcLen); fread(pSrcData, nSrcLen, 1, fp); fclose(fp); size_t nDesLen = nSrcLen; byte* pDesData = (byte*)malloc(nDesLen); byte prop[5] = {0}; size_t nPropSize = 5; int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, \ 9, 1<<24, 3, 0, 2, 32, 2); if ( SZ_ERROR_OUTPUT_EOF == nRet ) {//申請記憶體不足 free(pDesData); nDesLen += nSrcLen; pDesData = (byte*)malloc(nDesLen); nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, \ 9, (1<<24), 3, 0, 2, 32, 2); } if ( SZ_OK == nRet ) {//壓縮完成 fp = fopen("c:\\des_7z.dat", "wb+"); if ( NULL != fp ) { fwrite(pDesData, nDesLen, 1, fp); fclose(fp); } } free(pDesData); free(pSrcData); } } FreeLibrary(hModule);
int nRet = LzmaCompress(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, 1<<24, 3, 0, 2, 32, 2);
這裡LzmaCompress只是一個自定義的函式指標型別,並不是例項指標。改成:
int nRet = pLzmaCom(pDesData, &nDesLen, pSrcData, nSrcLen, prop, &nPropSize, 9, 1<<24, 3, 0, 2, 32, 2);
問題解決,竟然這麼簡單,太大意了。如果你出現這種錯誤,檢查程式碼,看看呼叫的是不是函式例項指標而非函式宣告。
這種錯誤在MSDN上的說明是:
編譯器錯誤 C2564
Visual Studio 2008 其他版本
更新:2007 年 11 月
錯誤訊息
“type”: 到內建型別的函式樣式轉換隻能接受一個引數
內建型別的函式樣式型別轉換採用單個引數。
下面的示例生成 C2564:
// C2564.cpp
void g(float f, double d) {
int j = int(f, d); // C2564
}
感覺沒啥用,這裡只是傳引數目不對而已。