C2666: Visual Studio no puede elegir una sobrecarga adecuada de una función

Tengo 2 declaraciones

void log::Category::Log(bool,const log::Priority &,const char *,...) 
void log::Category::Log(const log::Priority &,const char *,...)

entonces llamo

m_log.Log(log::Priority::PRI_DEBUG, "%s", pszStr);

log::Priority es enum.

¿Por qué compilador coincide con ambos?

Pregunta hecha hace 3 años, 5 meses, 0 días - Por byteninja


2 Respuestas:

  • El error C2666 que estás experimentando en Visual Studio se produce cuando el compilador no puede decidir cuál de las sobrecargas de una función debe utilizar, ya que ambas coinciden con los argumentos proporcionados.

    En tu caso, estás llamando a la función log::Category::Log() con los argumentos log::Priority::PRI_DEBUG y "%s". El problema es que tanto la primera como la segunda sobrecarga de la función podrían coincidir con estos argumentos, ya que la primera tiene un booleano y una prioridad de registro, mientras que la segunda tiene solo una prioridad de registro.

    Para resolver este problema, puedes proporcionar más información al compilador para que pueda determinar cuál de las dos sobrecargas debe utilizarse. Una forma de hacerlo es hacer un casting explícito de la prioridad de registro al tipo correcto, por ejemplo:

    cpp
    m_log.Log(static_cast(log::Priority::PRI_DEBUG), "%s", pszStr);
    

    Al hacer esto, estás indicando al compilador exactamente cuál es la sobrecarga que deseas utilizar, evitando la ambigüedad y resolviendo así el error C2666.

    Respondida el Dec 17, 2020 a las 19:04 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El compilador coincide con ambas sobrecargas porque ambas son válidas para los argumentos proporcionados.

    Sobrecarga 1:

    cpp
    void log::Category::Log(bool, const log::Priority&, const char, ...)
    

    Esta sobrecarga toma tres argumentos:

    • Un booleano que especifica si el mensaje debe registrarse.
    • Una referencia a una constante `log::Priority` que especifica la prioridad del mensaje.
    • Un puntero a un carácter que contiene el formato del mensaje.

    Sobrecarga 2:

    cpp
    void log::Category::Log(const log::Priority&, const char, ...)
    

    Esta sobrecarga toma dos argumentos:

    • Una referencia a una constante `log::Priority` que especifica la prioridad del mensaje.
    • Un puntero a un carácter que contiene el formato del mensaje.

    En tu llamada:

    cpp
    m_log.Log(log::Priority::PRI_DEBUG, "%s", pszStr);
    

    Estás pasando una constante log::Priority y un puntero a carácter. Esto coincide con las dos sobrecargas.

    Solución:

    Para resolver la ambigüedad, puedes proporcionar un argumento adicional a la llamada Log:

    cpp
    m_log.Log(true, log::Priority::PRI_DEBUG, "%s", pszStr);
    

    Esto coincidirá con la Sobrecarga 1, que toma un booleano como primer argumento.

    Respondida el Dec 17, 2020 a las 19:10 - por Gemini

    Votos positivos: 0 | Votos negativos: 0