error: no hay una función de coincidencia para la llamada a ‘min (int & sin firmar largo, int sin firmar &)’

2 minutos de lectura

avatar de usuario de vvill
vvll

Estoy usando ubuntu 12.04 – 64 bits. Lo probé con boost 1.46, 1.48, 1.52 y gcc 4.4 y 4.6 Cuando intento compilar:

while (m_burstReqBeatsRemain) {
                if (m_burstReqAddress % m_dramRowSize == 0) {
                    m_admRequestQueue.push_back(adm_request());
                    adm_request &req = m_admRequestQueue.back();
                    req.address = m_burstReqAddress;
                    req.command = tlm::TLM_READ_COMMAND;
                    //call to min function
                    req.readLen = std::min(m_burstReqBeatsRemain * sizeof(Td), m_dramRowSize);
                }
                m_burstReqBeatsRemain--;
                m_burstReqAddress += sizeof(Td);
                m_ocpTxnQueue.push_back(m_ocpReq);
}

me sale este error:

no matching function for call to ‘min(long unsigned int&, unsigned int&)
from /usr/include/c++/4.6/bits/stl_algobase.h*

Nota: con ubuntu 12.04 32 bits funciona bien

¿Alguna idea de cómo puedo arreglar esto?

  • Eso es porque está tratando de tomar “min” de dos tipos diferentes, y “min” espera que ambos valores sean del mismo tipo.

    – Mats Peterson

    24 de enero de 2013 a las 18:19

Avatar de usuario de Nawaz
Nawaz

std::min es una plantilla de función en T cual es el tipo de ambas cosas parámetros de la función. Pero parece que pasa argumentos de función de diferente tipo, y confiar en la deducción de argumentos de plantilla a partir de argumentos de función, lo cual no es posible.

Entonces la solución es:

  • No confíe en la deducción del argumento de la plantilla, sino que mencione explícitamente el argumento de la plantilla:

    std::min<unsigned long>(ulongarg, uintarg); //ok
         //^^^^^^^^^^^^^^^ 
         //don't rely on template argument deduction
         //instead pass template argument explicitly.
    
  • O pase argumentos de función del mismo tipo:

    std::min(ulongarg, static_cast<unsigned long>(uintarg)); //ok
                      //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                      //pass both arguments of same type
    

  • @user2008530: Ese es un error del compilador, o es un error en la implementación de std::min.

    – Nawaz

    24/01/2013 a las 18:30


  • @user2008530: gcc está siendo tonto. en esa plataforma unsigned long y unsigned int son esencialmente del mismo tipo. En mi humilde opinión, gcc aún debería darte un error, pero es probable que esa sea la razón por la que no lo es.

    – Omnifaro

    24/01/2013 a las 18:30

  • Entonces, ¿probablemente el comportamiento del método en la versión de 32 bits no será el comportamiento esperado?

    – vvll

    24 de enero de 2013 a las 18:53

  • @ usuario2008530: Sí. unsigned long y unsigned int son dos tipos diferentes, por lo que el compilador debería dar error.

    – Nawaz

    24 de enero de 2013 a las 18:54

Avatar de usuario de Vishal Kumar
vishal kumar

template<typename T,typename T1>T amax(T &a,T1 b){if(b>a)a=b;return a;}
template<typename T,typename T1>T amin(T &a,T1 b){if(b<a)a=b;return a;}

Defina su plantilla para min y max, no dará error.

¿Ha sido útil esta solución?