2010-11-19 54 views
2

Je l'ai dans mon code.Comment puis-je calculer le maximum de deux variables size_t

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

et je reçois cette erreur:

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) 

je crois comprendre que size_t est un entier non signé. Alors pourquoi est-ce un problème et comment puis-je le contourner.

Compiler avec:

$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' est pas nécessairement un' unsigned', mais je me demande où les candidats viennent de? – UncleBens

+0

Je ne peux pas reproduire cela sur gcc 4.4.1. Pouvez-vous poster un programme de test complet? – ssegvic

+0

Ajout de std :: to max résolu le problème Je pense que le max a été masqué par un autre en-tête ou quelque chose. –

Répondre

11
#include <algorithm> 

size_t val1; 
size_t val2; 

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

Je ne pense pas que est nécessaire. – Arkadiy

+0

@Arkadiy - vous avez raison, je l'ai inclus pour plus de clarté –

2

size_t est pas un unsigned int nécessairement, il est dépendant de la plateforme. Si vous compilez pour 32 bits, ou si vous savez que votre vecteur aura une taille inférieure à 4 milliards, vous pouvez effectuer un cast en toute sécurité vers un int non signé. Certaines plates-formes 64 bits utilisent une taille_t 64 bits, mais ont un int non signé comme seulement 32 bits.
Essayez d'utiliser ce lieu de votre code actuel:

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

-1

Essayez ceci:

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

Je ne pense pas size_t est en fait unsigned int. Je pense qu'il est son propre type, pas un typedef - au moins en g ++

Utilisez std :: max:

#include <algorithm> 

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