2013-01-24 8 views
15

Używam ubuntu 12.04 - 64 bity. Testowałem go z doładowania 1,46, 1,48, 1,52 i gcc 4.4 i 4.6 Kiedy próbuję skompilować:błąd: brak pasującej funkcji dla wywołania 'min (długa, niepodpisana int &, unsigned int &)'

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); 
} 

otrzymuję ten błąd:

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

Uwaga: Ubuntu 12.04 32 bity prac grzywny

Każdy pomysł, jak to naprawić?

+5

To ponieważ próbujesz przyjąć "min" dwóch różnych typów, a "min" oczekuje, że obie wartości będą tego samego typu. –

Odpowiedz

33

std::min to szablon funkcji na T, który jest typem obu parametrów funkcji. Ale wydaje się, że przekazujesz argumenty funkcji różnego typu, i polegają na odjęciu argumentów z argumentów funkcji, co nie jest możliwe.

więc poprawka jest:

  • Albo nie opierają się na odliczenie szablon argumentu, zamiast wyraźnie wspomnieć argument szablonu:

    std::min<unsigned long>(ulongarg, uintarg); //ok 
        //^^^^^^^^^^^^^^^ 
        //don't rely on template argument deduction 
        //instead pass template argument explicitly. 
    
  • Albo przekazywać argumenty funkcyjnych tego samego typu:

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

Ale dlaczego działa w 32 bitach ubuntu? – Will

+1

@ user2008530: To jest błąd kompilatora lub jest to błąd w implementacji 'std :: min'. – Nawaz

+2

@ user2008530: gcc jest głupie. Na tej platformie 'unsigned long' i' unsigned int' są w zasadzie tego samego typu. IMHO, gcc nadal powinien dawać ci błąd, ale prawdopodobnie tak nie jest. – Omnifarious

Powiązane problemy