Переменные аргументы и перегрузка функций - PullRequest
1 голос
/ 20 мая 2010

Я пытаюсь улучшить обработку ошибок 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.

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Ну, это переменные аргументы - это означает, что нулевые аргументы также допустимы. В этом случае компилятор не сможет выбирать между первой и третьей функциями, поскольку их первый аргумент идентичен.

0 голосов
/ 22 июля 2014

Попробуйте сделать третью версию более строгой, чтобы потребовался дополнительный параметр:

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