2016-07-21 6 views
1

Werde ich verrückt, oder ist das ein Fehler mit dem Cygwin g ++ Compiler?Anhängen (uint8_t) 0x00 an eine std :: string verursacht mehrdeutigen Überlastungsfehler auf Cygwin?

Dies funktioniert:

std::string record; 
record += (uint8_t)1; 

Es ist auch total cool ist es, eine konstante Variable mit Wert mit Anhängen 0:

const uint8_t tZero = 0x00; 
std::string record; 
record += tZero; 

jedoch diesen Code ausgeführt wird bewirkt, dass ein mehrdeutigen Betreiber Überlastung Fehler:

std::string record;  
record += (uint8_t)0; 

Die Kandidaten, die es zur Verfügung stellt, machen angesichts der expliziten Besetzung keinen Sinn, besonders Sinc e einer der Kandidaten scheint identisch zu sein, was in den Fehler gegeben:

sources/logger.cpp:55:20: error: ambiguous overload for `operator+=' (operand types are `std::string {aka std::basic_string<char>}' and `uint8_t {aka unsigned char}') 
    record += (const uint8_t)0; 

note: candidates: 
    operator+=(const basic_string& __str) 
    operator+=(const _CharT* __s) 
    operator+=(_CharT __c) 

Dieser Fehler in Visual Studio erscheint nicht, auch, kompiliert sie und fügt nur ein 0x00 Byte als ich erwartet.

Als Referenz verwende ich Zeichenfolgen als Puffer für binäre Protokolldaten. Es gibt wahrscheinlich einen besseren Container zu verwenden, aber in der Lage zu + = Bytes in ist zu nützlich, um nicht zu haben.

Hat cygwin einen Fehler mit seiner String-Implementierung, oder soll das einen Fehler verursachen, da es 0 ist? Es macht mir nichts aus, eine const-Variable zu verwenden, um den Fehler zu beheben, aber es wird komisch aussehen, da dieser Prozess mehrere Male durch den Code mit anderen Werten wiederholt wird.

+1

Versuchen Sie es zu einem 'char' zu werfen? – kennytm

+0

_ "vor allem, da einer der Kandidaten identisch zu dem ist, was in dem Fehler angegeben wird:" _ Welches? 'char' ist nicht identisch mit' unsigned char' –

+0

@kennytm Es ist eine Vorliebe von mir, explizit anzugeben, welche Größe meine Variablen haben (ich mache viel Embedded-Entwicklung), weshalb ich nicht auf 'char' gewirkt habe. Laut der Antwort sind Sie richtig, und das würde funktionieren. @ Jonathan Ich nehme an, dass die Signiertheit bei der Auswahl des passenden Musters keine Rolle spielt. Ist das nicht der Fall? – DweebsUnited

Antwort

3

Dies ist eine ziemlich neue Änderung der C++ - Sprache. Heutzutage sollte Ihr Code operator+=(_CharT) aufrufen. In der Vergangenheit sollte Ihr Code aufgrund einer Mehrdeutigkeit sogar mit const uint8_t tZero = 0x00; fehlschlagen. Sie haben es mit einem Compiler zu tun, der diese Änderung teilweise implementiert.

Vor der Änderung der Sprache war jeder Integer-Konstantenausdruck mit dem Wert Null implizit in einen beliebigen Zeigertyp konvertierbar und lieferte einen Nullzeiger. Deshalb kann (uint8_t)0 in char oder const char * konvertiert werden.

Jetzt kann nur ein Literal 0 in Zeigertypen konvertiert werden. tZero oder sogar (uint8_t)0 sollten nicht mehr in const char * konvertiert werden. Dies behebt die Mehrdeutigkeit: Nur die Umwandlung zu char bleibt immer noch als eine Möglichkeit.

+0

Das macht Sinn. Ich hatte den Eindruck, dass ein "Char" nur eine Art "sint8_t" war, aber habe ich jetzt Recht, wenn ich sage, dass sie anders gehandhabt werden? Ich habe eine Vorliebe dafür, immer die Integer-Typen fester Größe zu verwenden, weshalb ich nicht auf "char" umgewandelt habe (ich mache eine Menge Arduino-Entwicklung und möchte explizit angeben, welche Größe meine Typen sind). – DweebsUnited

+1

@DweebsUnited Da 'sint8_t' und' uint8_t' unterschiedliche Typen sind, sind 'char' und' uint8_t' auf Systemen, bei denen 'char' und' sint8_t' vom selben Typ sind, notwendigerweise unterschiedliche Typen. – hvd

+0

Vielen Dank für die Hilfe.Es scheint, dass ich zu viel Vertrauen darauf habe, dass der Compiler ableitet, was ich tun möchte. Ich beginne auch zu erkennen, dass Saiten wirklich nicht dazu gedacht sind, das zu tun, was ich mit ihnen mache. – DweebsUnited