1. 程式人生 > >VS編譯錯誤:“到內建型別的函式樣式轉換隻能接受一個引數”解決方案

VS編譯錯誤:“到內建型別的函式樣式轉換隻能接受一個引數”解決方案

呼叫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
}
感覺沒啥用,這裡只是傳引數目不對而已。