2013-01-24 14 views
15

मैं उबंटू 12.04 - 64 बिट्स का उपयोग कर रहा हूं। मैं बढ़ावा 1.46, 1.48, 1.52 और जीसीसी के साथ यह परीक्षण किया 4.4 और 4.6 जब मैं संकलन करने का प्रयास करें:त्रुटि: कॉल के लिए कोई मिलान करने वाला फ़ंक्शन 'मिनट (लंबे समय से हस्ताक्षरित int और, हस्ताक्षरित int &)'

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

नोट::

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

मैं इस त्रुटि मिलती है Ubuntu 12.04 32 बिट काम करता है के साथ ठीक

कोई विचार यह है कि मैं इसे कैसे ठीक कर सकता हूं?

+5

यह है क्योंकि आप दो अलग-अलग प्रकारों के "मिनट" को लेने की कोशिश कर रहे हैं, और "मिनट" दोनों मानों को एक ही प्रकार के होने की अपेक्षा करता है। –

उत्तर

33

std::minT पर एक फ़ंक्शन टेम्पलेट है जो फ़ंक्शन के पैरामीटर दोनों प्रकार का है। लेकिन आप विभिन्न प्रकार के फ़ंक्शन तर्क, और फ़ंक्शन तर्कों से टेम्पलेट तर्क कटौती पर भरोसा करते हैं, जो संभव नहीं है।

तो ठीक है:

  • या तो टेम्पलेट तर्क कटौती पर भरोसा नहीं है, बजाय स्पष्ट रूप से उल्लेख टेम्पलेट तर्क:

    std::min<unsigned long>(ulongarg, uintarg); //ok 
        //^^^^^^^^^^^^^^^ 
        //don't rely on template argument deduction 
        //instead pass template argument explicitly. 
    
  • या एक ही प्रकार के समारोह तर्क पारित:

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

लेकिन, यह उबंटू 32 बिट्स में क्यों काम करता है? – Will

+1

@ user2008530: यह एक कंपाइलर बग है, या यह 'std :: min' के कार्यान्वयन में एक बग है। – Nawaz

+2

@ user2008530: gcc गूंगा जा रहा है। उस प्लेटफ़ॉर्म पर 'हस्ताक्षरित लंबे' और 'हस्ताक्षरित int' अनिवार्य रूप से एक ही प्रकार के होते हैं। आईएमएचओ, जीसीसी को अभी भी आपको एक त्रुटि देनी चाहिए, लेकिन संभवतः ऐसा क्यों नहीं है। – Omnifarious

संबंधित मुद्दे