2010-11-19 116 views
2

我在我的代碼中有這個。如何計算兩個size_t變量的最大值

vector<unsigned int> import; 
vector<unsigned int> aquired; 
. . . 
size_t new_size = max(import.size(),aquired.size()); 

,我得到這個錯誤:

error: more than one instance of 
overloaded function "max" matches the 
argument list: 
      function "max(int, int)" 
      function "max(unsigned int, unsigned int)" 
      function "max(int, unsigned int)" 
      function "max(unsigned int, int)" 
      function "max(long long, long long)" 
      function "max(unsigned long long, unsigned long long)" 
      function "max(long long, unsigned long long)" 
      function "max(unsigned long long, long long)" 
      function "max(float, float)" 
      function "max(double, double)" 
      function "max(float, double)" 
      function "max(double, float)" 
      argument types are: (size_t, size_t) 

我的理解是,size_t是一個unsigned int。那麼爲什麼這是一個問題,我如何解決這個問題。

與編譯:

$gcc --version 
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 
$nvcc --version 
nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2010 NVIDIA Corporation 
Built on Wed_Sep__8_17:12:45_PDT_2010 
Cuda compilation tools, release 3.2, V0.2.1221 
+1

'size_t'不一定是'unsigned',但我不知道候選人來了從? – UncleBens 2010-11-19 21:02:45

+0

我無法在gcc 4.4.1上重現這一點。你能發佈一個完整的測試程序嗎? – ssegvic 2010-11-19 21:03:43

+0

添加std :: to max解決了這個問題我認爲max被另一個頭文件或其他東西掩蓋了。 – 2010-11-19 21:07:11

回答

11
#include <algorithm> 

size_t val1; 
size_t val2; 

size_t maxValue = std::max<size_t>(val1, val2); 
+1

我不認爲是必要的。 – Arkadiy 2010-11-19 21:09:15

+0

@Arkadiy - 你說得對,我只是爲了清楚起見而已 – 2010-11-19 21:10:43

2

爲size_t是不是一個unsigned int必然,它是依賴於平臺。如果你正在編譯32位,或者如果你知道你的向量大小在40億以下,你可以安全地轉換爲一個unsigned int。一些64位平臺使用64位size_t,但只有32位才具有unsigned int。
嘗試使用,代替目前的這段代碼:

size_t new_size = max((unsigned int)import.size(),(unsigned int)aquired.size());

-1

試試這個:

std::max((unsigned int)import.size(), (unsigned int)aquired.size()); 
2

我不認爲爲size_t實際上是unsigned int類型。我懷疑這是它自己的類型,而不是一個typedef - 至少在G ++

使用std ::最大:

#include <algorithm> 

int main(int argc, char **argv) 
{ 
    size_t a = 2, b=3; 
    std::max(a,b); 
    return 0; 
}