2013-01-24 20 views
15

私はubuntu 12.04 - 64ビットを使用しています。私がコンパイルしようとすると、私はブースト1.46、1.48、1.52および GCC 4.4と4.6 でそれをテストした:エラー: 'min(long 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); 
} 

私はこのエラーを取得する:

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ビットの作品とをfine

どのように私はこれを修正することができますか?

+5

2つの異なるタイプの「最小」を取ろうとしているため、「最小」は両方の値が同じタイプであることを期待しているからです。 –

答えて

33

std::minは、のタイプであるTの関数テンプレートです。両方とも関数のパラメータです。しかし、あなたは異なる型の関数引数を渡すように見えます。は、関数引数からのテンプレート引数の控除に依存しますが、これは不可能です。

ので、修正は次のとおりです。

  • のどちらかではなく、明示的に言及し、テンプレート引数控除にテンプレート引数依存しない:

    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

しかし、なぜそれはubuntu 32ビットで動作しますか? – Will

+1

@ user2008530:それはコンパイラのバグです。それは 'std :: min'の実装のバグです。 – Nawaz

+2

@ user2008530:gccはダムになっています。そのプラットフォームでは 'unsigned long'と' unsigned int'は本質的に同じ型です。 IMHO、gccはまだあなたにエラーを与えているはずですが、そうではない可能性があります。 – Omnifarious

関連する問題