2011-11-17 13 views
7

Per qualche motivo, quando definisco una variabile come "uint" anziché "unsigned int" nel mio programma, si sbaglia. Questo sembra strano, perché uint è typedef come:L'uso di un typ tipof uint causa un errore, mentre "unsigned int" non ...?

typedef unsigned int uint; 

... quindi vorrei pensare che avrei potuto usare i due in modo intercambiabile. Per essere più precisi, sto assegnando il risultato di una funzione che restituisce "unsigned int" in una variabile uint, quindi usando quel uint in una chiamata di ridimensionamento vettoriale ... a quel punto si sbaglia. Vale a dire, il mio codice simile a questa:

unsigned int getUInt() 
{ 
    return 3; 
} 

int main(void) { 
    vector<vector<float> > vectVect(100000); 
    for(uint i = 0; i < vectVect.size(); ++i) 
    { 
     vector<float>& myVect = vectVect[i]; 
     uint myUnsignedInt = getUInt(); 
     myVect.resize(myUnsignedInt); 
    } 
    cout << "finished" << endl; 
} 

... e la linea E errori a è la linea myVect.resize.

Ovviamente, ho già una soluzione, ma mi piacerebbe capire perché questo sta accadendo, dato che sono piuttosto sconcertato. Qualcuno ha qualche idea?

PS - Nel caso in cui qualcuno pensi che possa essere importante, sto utilizzando gcc v4.1.2 su fedora 15 ... e il file include che definisce uint è /usr/include/sys/types.h.

+9

Ogni volta che si verifica un errore, è sempre necessario includere l'errore in questione nella domanda. –

+1

Dovresti mostrare il codice reale che sta fallendo. In particolare i '# include'-s, le dichiarazioni' using', ecc. E GCC 4.6 è probabilmente molto più conforme standard di 4.1. –

+0

E [come puoi vedere qui] (http://ideone.com/Y1DRP), l'errore non si verifica nell'esempio che hai fornito (almeno con quella versione di gcc). –

risposta

6

La mia ipotesi è che c'è un altro uint nel sistema. Prova a rinominare il tuo con qualcosa di insolito o ancora meglio avvolgerlo in uno spazio dei nomi.

namespace MY { 
    typedef unsigned int uint; 
} 

for (MY::uint i = 0; .... 
+2

solo andando a scegliere questo come risposta, dato che era una buona ipotesi, e non ho mai capito esattamente cosa stava succedendo ... –

-1

La mia ipotesi è che stia cercando di formare una "gerarchia" di qualche tipo.

In altre parole, si ha:

typedef unsigned int size_t; 
typedef unsigned int uint; 

Se size_t è "più specifico" di un generico unsigned int, quindi ha senso impedire che venga convertito in uint, che può essere "più specifico" rispetto a qualsiasi vecchio unsigned int.

mi aspetto che questo sia un avvertimento, se non altro, però, non è un errore ...

+3

Non penso sia così. Un 'typedef' crea un alias per un tipo, non un nuovo tipo. Quindi, date le dichiarazioni di cui sopra, 'unsigned int',' size_t' e 'uint' sono tutti dello stesso tipo (come' unsigned' e 'int unsigned'). –

+0

@KeithThompson: Questo è ciò che * dovrebbe * accadere, sono d'accordo; Sto indovinando forse il compilatore stava facendo accidentalmente questo invece, idk. – Mehrdad