2015-04-29 15 views
5

ich eine Funktion definiert:unsigned long vs size_t verursacht Funktion Überlastungen ausfallen

void myfunc(size_t param1, size_t param2){ 
... 
} 

es funktioniert gut. Aber wenn ich versuche, diese Funktion zu überlasten

void myfunc(unsigned long param1, unsigned long param2){ 
... 
} 

Es schlägt mit der folgenden Meldung zu kompilieren: Fehler: myfunc (unsigned long param1, unsigned long param2) nicht überlastet werden.

Wie kann ich dieses Problem lösen, ohne staic_cast die Eingabeparameter zu size_t?

danke!

+0

Meinen Sie, dieses C++ zu markieren? –

+0

Das liegt wahrscheinlich daran, dass "size_t" in Ihrer Umgebung als "unsigned long" definiert ist. C/C++ hat in diesem Aspekt kein sehr starkes Typsystem. – Mysticial

+2

Dies ist eine schlechte Idee, denn selbst wenn es funktioniert, würden Sie mehrdeutige Aufruffehler bekommen, wenn Sie versuchen, die Funktion zum Beispiel mit 'int' zu verwenden. Können Sie erklären, welches Problem Sie lösen möchten? –

Antwort

3

Es klingt wie size_t und unsigned long sind die gleichen Typ auf Ihrem System; Der Compiler beschwert sich, dass Sie zwei gleiche Funktionen haben. Darüber hinaus ist das Überladen mit mehreren Zahlentypen in der Regel eine schlechte Idee, da der Compiler möglicherweise aufgrund von Casting-Möglichkeiten nicht erkennen kann, welche Überladung Sie haben möchten. Versuchen Sie stattdessen, Vorlagen zu verwenden:

template <T> 
void myfunc(T param1, T param2){ 
... 
} 
+0

ist nicht size_t eine vorzeichenlose Ganzzahl? Es kann unsigned int32 oder unsigned int64 sein, aber kann es lange nicht signiert sein? – mhs

+0

scheint es kann http://stackoverflow.com/questions/131803/unsigned-int-vs-size-t – mhs

+1

@mhs die Terminologie kann ein bisschen verwirrend bekommen; int, long, int32_t, uint32_t usw. sind Ganzzahl-Typen. Soweit ich weiß, werden sie normalerweise auf die Grundtypen typisiert, z. int oder unsigned lang. Der Unterschied besteht darin, dass die Basistypen vom Standard als MINDESTENS eine bestimmte Größe garantiert werden, während die intX_t-Typen garantiert GENAU X-Größe sind. Wenn Sie sich also auf einem System befinden, auf dem long ein 64-Bit-Datentyp ist, ist uint64_t möglicherweise nur lange vorzeichenlos. Ähnlich, wenn Sie an einem 64-Bit-System arbeiten, könnte size_t auch einfach so lange nicht signiert werden. – sabreitweiser