2010-05-20 47 views
1

我正試圖改進現有C++程序中的SQLite錯誤處理。我有一個自定義類型SQLiteException,並且我想寫一個宏來打印SQL的行號,文件名和錯誤消息。變量參數和函數重載

我已經定義了以下功能:

LogMessage(LPCTSTR message); // Does the real work. Appends a timestamp to the message and logs the message to disk 

LogMessage(LPCSTR message); // Simply converts message from ASCII to UNICODE and calls the original LogMessage(LPCTSTR message) function. 

LogMessage(LPCTSTR message, ...); // A new variable argument version of the function. It uses vsprintf to format into a temporary TCHAR string, and passes that string into the first LogMessage(LPCTSTR message) function. 

這是我遇到的麻煩。編譯器抱怨對重載函數的模糊呼叫。第三個功能是實現這樣的:

void LogMessage(LPCTSTR message, ...) 
{ 
TCHAR logBuffer[513]; 
va_list args; 
va_start(args, message); 
_vsntprintf(logBuffer, 512, message, args); 
va_end(args); 
LogMessage((LPCTSTR)logBuffer); 
} 

}

我已經加入宏是這樣寫的:

#define LOG_SQLITE_EXCEPTION(e) LogMessage(_T("%s %s %d"), CString(__FUNCTION__), CString(__FILE__), __LINE__); LogMessage(GetSQLiteErrorMessage(e)); 

我怎樣才能使編譯器調用的LogMessage的第一個版本函數在執行第三個版本?編譯器似乎忽略了'...'參數,並且無法分辨LogMessage的第一個和第三個實現之間的區別。

回答

3

那麼,這些是可變參數 - 意味着零參數也是可以接受的。在這種情況下,編譯器將無法在第一個和第三個函數之間進行選擇,因爲它們的第一個參數是相同的。

+0

我會推薦給這些功能(一點點)更具描述性的名稱。 – nielsj 2010-05-20 16:07:17

+0

這條線btw:LogMessage((LPCTSTR)logBu​​ffer); – nielsj 2010-05-20 16:08:42

+0

我將更改名稱,以使編譯器和其他程序員更清楚。 – 2010-05-20 16:51:59

0

嘗試使第三個版本更加嚴格,從而需要額外的參數:

template<typename T> 
LogMessage(LPCTSTR message, T _, ...) 
{ 
    (T)_; 
    // implementation same as above 
}