2013-01-24 12 views
15

Tôi đang sử dụng ubuntu 12.04 - 64 bit. Tôi đã thử nghiệm nó với tăng 1,46, 1,48, 1,52 và gcc 4.4 và 4.6 Khi tôi cố gắng biên dịch:lỗi: không có chức năng phù hợp cho cuộc gọi đến ‘min (dài unsigned 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); 
} 

tôi nhận được lỗi này:

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

Lưu ý: với ubuntu 12.04 32 bit công trình fine

Bất kỳ ý tưởng nào về cách khắc phục sự cố này?

+5

Đó là bởi vì bạn đang cố gắng lấy "phút" của hai loại khác nhau và "phút" mong đợi cả hai giá trị sẽ là cùng một loại. –

Trả lời

33

std::min là mẫu chức năng trên T là loại tham số cả hai của hàm. Nhưng bạn dường như vượt qua đối số chức năng của các loại khác nhau, dựa vào trích dẫn đối số mẫu từ các đối số hàm, điều này là không thể.

Vì vậy, việc sửa chữa là:

  • Hoặc không dựa vào khấu trừ mẫu đối số, thay vì công khai đề cập đến những mẫu đối số:

    std::min<unsigned long>(ulongarg, uintarg); //ok 
        //^^^^^^^^^^^^^^^ 
        //don't rely on template argument deduction 
        //instead pass template argument explicitly. 
    
  • Hoặc vượt qua đối số chức năng của cùng loại:

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

Nhưng, tại sao nó hoạt động trong ubuntu 32 bit? – Will

+1

@ user2008530: Đó là lỗi trình biên dịch, hoặc là lỗi trong quá trình triển khai 'std :: min'. – Nawaz

+2

@ user2008530: gcc đang bị câm. Trên nền tảng đó 'unsigned long' và' unsigned int' về cơ bản là cùng loại. IMHO, gcc vẫn nên cung cấp cho bạn một lỗi, nhưng đó có thể là lý do tại sao nó không phải là. – Omnifarious