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?
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
yunsigned 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
yunsigned int
son dos tipos diferentes, por lo que el compilador debería dar error.– Nawaz
24 de enero de 2013 a las 18:54
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.
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