Перегрузка с похожими конверсиями - PullRequest
0 голосов
/ 11 ноября 2011

С учетом этих двух функций:

bool logMessage(LogType_E, unsigned int, int, const char *, ...); //!< Log message with parameters

bool logMessage(LogType_E, int, const char *, ...); //!< Logs message with domain of Log class

И вызова одной из них:

A3D_LOG_INSTANCE.logMessage(Log::LOG_INFO, 0, "Number = %d", 10);

Ошибка 1 Ошибка C2666: 'AX :: Base :: Log ::logMessage ': 2 перегрузки имеют похожие преобразования o: \ AX_FusRecAlg \ src \ base \ test.u \ LogSimpleFileTest \ LogSimpleFileTest.cpp 50 AX.Base.LogSimpleFileTest

Может кто-нибудь объяснить мне на простом английском языке, почемуэта ошибка возникает и возможно предложить альтернативу?Я не понимаю, как функция, которая имеет 3 аргумента перед символом *, совпадает с функцией, которая имеет два аргумента?!

Спасибо.

Редактировать:

Поскольку некоторые из вас задаются вопросом, что я скрываю информацию: Невозможно изменить сигнатуру функции.Шаблоны использовать нельзя. Достаточно просто объяснить причину возникновения этой ошибки.

enum LogType_E {
        LOG_ERROR       = 0,            //!< error
        LOG_WARNING     = 1,            //!< warning
        LOG_SUCCESS     = 2,            //!< success
        LOG_INFO        = 3,            //!< info
        LOG_TRACE       = 4,            //!< trace message if tracing is enabled
        LOG_TRACE1      = 5,            //!< trace level 1
        LOG_TRACE2      = 6,            //!< trace level 2
        LOG_TRACE3      = 7,            //!< trace level 3
        LOG_TRACE4      = 8             //!< trace level 4
    };


bool logMessage(LogType_E, unsigned int, int, const char *, ...)
{
    return true;
}

bool logMessage(LogType_E, int, const char *, ...)
{
    return true;
}

int main()
{
    logMessage(LOG_TRACE, 0, 0, "Teststring 2");
    return 0;
}

Скопировать и вставить указанный выше код в файл .cpp и запустить его или щелкнуть здесь.

1 Ответ

1 голос
/ 11 ноября 2011

Это нормальное поведение. Из вашего примера:

logMessage(LOG_TRACE, 0, 0, "Teststring 2");

Второй параметр может быть как int, так и unsigned int. Вам нужно будет сделать явное приведение, чтобы оно заработало.

Например:

logMessage(LOG_TRACE, (unsigned int)0, 0, "Teststring 2");
...