web-dev-qa-db-ja.com

エラー:「min(long unsigned int&、unsigned int&)」の呼び出しに対応する関数がありません

私はubuntu 12.04-64ビットを使用しています。ブースト1.46、1.48、1.52、gcc 4.4、4.6でテストしました。コンパイルしようとすると、次のようになります。

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

私はこのエラーを受け取ります:

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

注:ubuntu 12.04では32ビットで問題なく動作します

どうすればこれを修正できますか?

23
Will

std::minTの関数テンプレートで、関数の両方パラメータのタイプです。しかし、異なるタイプの関数引数を渡すようですandは、関数引数からのテンプレート引数の推定に依存しています。これは不可能です。

だから修正は:

  • テンプレート引数の推定に依存せず、代わりにテンプレート引数を明示的に述べます。

    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
    
49
Nawaz