Я пытаюсь улучшить обработку ошибок SQLite в существующей программе C ++. У меня есть пользовательский тип 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.