Ich habe eine Reihe von Funktionen für alle [u]int{8|16|32|64}_t
-Typen überladen:
Ich rufe jetzt den Funktionsnamen mit einem Argument vom Typ long unsigned int
:
Dies erzeugt einen Fehler:
error: Aufruf von overloaded 'f (long unsigned int & amp;) ist mehrdeutig
Das passiert vermutlich, weil unsigned int
und uint32_t
unterschiedliche Typen sind. Aber ich kann die Funktion für long unsigned int
nicht überladen, weil dies eine redundante Definition ist. I.e .:
. . . produziert:
Fehler: 'std :: string f (uint32_t)' zuvor hier definiert
Es scheint, dass die Typmechanismen gegeneinander arbeiten: Es kann nicht herausfinden, welche Konvertierung verwendet werden soll, da jede Umwandlung gleichermaßen gültig ist, aber eine Überschreibung ohne Umwandlung kann nicht definiert werden, weil sie bereits erfolgt ist.
Ich kann das Argument aus verschiedenen Gründen nicht aussprechen. Gibt es einen Ausweg?
Plattform ist g ++ MinGW x86 unter Windows 7 x86-64.
Das Folgende ist mein "Test" basierend auf dem oben angegebenen Code:
%Vor%Beispielausgabe:
%Vor%(Ich habe meinen Lauf mit clang ++ kopiert, aber die Ergebnisse sind die gleichen für g ++)
Dies stellt sicher, dass sowohl die unsigned long
als auch die unsigned long long
Typen abgedeckt sind. Leider ist einer davon uint64_t
, also muss er entfernt werden.
Wenn Sie Variablen als unsigned long
deklarieren, müssen Sie eine Funktion angeben, die genau das übernimmt - und davon auszugehen, dass sie uint32_t
entspricht, ist wahrscheinlich inkorrekt - selbst wenn sie dieselbe Bitgröße haben.
Welche Plattform benutzen Sie?
Unter Windows (Visual Studio 2010) ist unsigned long int
ein anderer Typ als die von Ihnen erwähnten.
Das Hinzufügen einer Überladung speziell für diesen Typ hat den Fehler behoben. Diese Antwort (und / oder Google) wirft möglicherweise mehr Licht auf das Problem: Der Typ von unsigned long unterscheidet sich von uint32_t und uint64_t von Windows (VS2010) .
Ich habe eine Überladung für unsigned long int
wie folgt definiert:
... in Visual Studio 2010 wie folgt getestet:
%Vor%... und hat das erwartete Ergebnis:
%Vor%Da Sie Überladungen für (fast?) jeden Typ definieren, sollte Ihre Funktion stattdessen eine Vorlage sein?
%Vor%Wenn es einen Satz Code gibt, der für alle - oder sogar die meisten - Typen funktioniert, würde das Ihnen viel Arbeit ersparen.
Wenn Sie aus irgendeinem Grund den Aufruf mit dem unsigned long int
-Wert erzwingen müssen, um ihn als einen anderen Typ zu behandeln (wie uint32_t
), können Sie die Template-Instanziierung auf der Call-Site angeben:
Tags und Links c++