2010-11-19 6 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 является неподписанных 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

+0

Я не могу воспроизвести это на gcc 4.4.1. Можете ли вы опубликовать полную тестовую программу? – ssegvic

+0

Добавление std :: to max разрешило проблему. Я думаю, что макс был замаскирован другим заголовком или чем-то еще. –

ответ

11
#include <algorithm> 

size_t val1; 
size_t val2; 

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

Не думаю, что не требуется. – Arkadiy

+0

@Arkadiy - вы правы, я включил это только для ясности –

2

size_t не неподписанных INT обязательно, это зависит от платформы. Если вы компилируете 32-разрядную версию или знаете, что ваш вектор будет иметь размер менее 4 миллиардов, вы можете безопасно использовать неподписанный int. Некоторые 64-разрядные платформы используют 64-разрядный size_t, но имеют unsigned int как только 32-разрядные.
Попробуйте использовать это вместо текущего кода:

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 на самом деле без знака внутр. Я подозреваю, что это его собственный тип, а не ЬурейеЕ - по крайней мере, в г ++

Использование станд :: макс:

#include <algorithm> 

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