Mehrdeutiger Aufruf von "long unsigned int" für "uint32_t"

8

Ich habe eine Reihe von Funktionen für alle [u]int{8|16|32|64}_t -Typen überladen:

%Vor%

Ich rufe jetzt den Funktionsnamen mit einem Argument vom Typ long unsigned int :

auf %Vor%

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 .:

%Vor%

. . . 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.

    
imallett 23.02.2014, 16:56
quelle

3 Antworten

0

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.

    
Mats Petersson 23.02.2014, 20:26
quelle
1

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:

%Vor%

... in Visual Studio 2010 wie folgt getestet:

%Vor%

... und hat das erwartete Ergebnis:

%Vor%     
aldo 23.02.2014 17:26
quelle
0

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:

%Vor%     
aldo 24.02.2014 06:17
quelle

Tags und Links