3

与えられた:

typedef struct { char val[SOME_FIXED_SIZE]; } AString;
typedef struct { unsigned char val[SOME_FIXED_SIZE]; } BString;

<<とで使用できるostream 演算子を追加したいと思いAStringますBString

std::ostream & operator<<(std::ostream &out, const AString &str)
{ 
   out.write(str.val, SOME_FIXED_SIZE);
   return out;
}

に対して同じことをするBStringと、コンパイラは について不平を言いinvalid conversion from 'const unsigned char*' to 'const char*'ます。には引数ostream.writeがありません。const unsigned char*

それ<<自体が を受け入れるように見えるconst unsigned charので、このようなことを試します

std::ostream & operator<<(std::ostream &out, const BString &str)
{ 
    for (int i=0; i<SOME_FIXED_SIZE; i++)
    {
        out<<str.val[i];
    }
    return out;
}

これが正しい/良い習慣なのか、それとももっと良い方法があるのか​​ 誰か教えてもらえますか? コメントを歓迎します!

4

2 に答える 2

2

最も簡単でクリーンな解決策はstd::string、たとえば次のように作成することです。

out << std::string(str.val, str.val + sizeof(str.val));

ただし、問題は、フォーマットされた出力とフォーマットされていない出力のどちらが必要かということです。フォーマットされていない出力の場合は、醜いですが、 reinterpret_cast.

于 2011-07-06T10:00:57.033 に答える
0

にキャストすることを考えましたかchar*

std::ostream & operator<<(std::ostream &out, const BString &str)
{ 
   out.write(reinterpret_cast<char*>(str.val), sizeof(str.val));
   return out;
}
于 2011-07-06T10:00:12.810 に答える