2016-07-21 18 views
1

私は狂っているのですか、これはcygwin g ++コンパイラのバグですか?(uint8_t)0x00をstd :: stringに追加すると、cygwinであいまいなオーバーロードエラーが発生しますか?

これは動作します:

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

また、値0でのconst変数を追加すると、完全にクールです:

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

しかし、このコードを実行すると、あいまいな演算子オーバーロードエラーが発生

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

明示的なキャスト、特にsinc電子候補の一つがエラーに与えられているものと同じであるように思わ:このエラーはまた、Visual Studioで表示されない

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) 

、それは私が期待するのと同様0x00のバイトをコンパイルし、追加します。

参考のため、バイナリログデータのバッファとして文字列を使用しています。おそらく、より良いコンテナを使用することができますが、+バイトで入力できるのはあまり役に立ちません。

cygwinの文字列の実装にバグがありますか、それとも0なのでエラーが発生するはずですか?エラーを修正するためにconst変数を使用しても構いませんが、このプロセスは他の値を持つコードを通して複数回繰り返されるため、奇妙に見えます。

+1

'char'にキャストしようとしていますか? – kennytm

+0

_ "特に、候補の1つがエラーで示されているものと同一であるように見えるので、「_どちらですか? 'char'は' unsigned char'と同じではありません –

+0

@kennytm私の変数の大きさを明示するのは私の好みです(私はたくさんの組み込み開発をしています)。答えによると、あなたは正しい、それは動作します。 @ジョナサン私は、符合が一致するパターンを選ぶ際に署名の重要性はないと思ったと思います。そうじゃないの? – DweebsUnited

答えて

3

これはかなり最近のC++言語の変更です。現在、コードはoperator+=(_CharT)に電話する必要があります。過去には、const uint8_t tZero = 0x00;であってもあいまいさが原因でコードが失敗するはずです。あなたはその変更が部分的に実装されているコンパイラを扱っています。

その言語に変更する前に、値がゼロの整数定数式は、暗黙的に任意のポインタ型に変換可能であり、NULLポインタを生成しました。そのため、(uint8_t)0char、またはconst char *に変換することができます。

ここで、リテラル0はポインタ型に変換できます。 tZero、またはさらに(uint8_t)0は、const char *に変換されなくなりました。これにより、曖昧さが解決されます。charへの変換のみが可能です。

+0

それは理にかなっています。私は「char」がtypedef'd 'sint8_t'だったという印象を受けましたが、別の扱いをしていると言って正しいのですか? 私は常に固定サイズの整数型を使用することを好みます。そのため、私は 'char'にキャストしていませんでした(私は多くのArduino開発を行い、どのようなサイズの型があるかを明示するのが好きです)。 – DweebsUnited

+1

@DweebsUnited 'sint8_t'と' uint8_t'は別個の型であるため、 'char'と' sint8_t'が同じ型のシステムでは、 'char'と' uint8_t'は必然的に異なる型になります。 – hvd

+0

ありがとうございました。コンパイラに私がやりたがっていることを推論させることに、あまりにも多くの信頼を置いているようです。私はまた、文字列が実際に私がそれらとやっていることをするように設計されていなかったことを認識し始めている。 – DweebsUnited

関連する問題