0
typedef struct {
uint64_t low;
uint64_t cache_size;
uint32_t range;
uint8_t cache;

/// Number of symbols in the tables
size_t count;

/// rc_encode()'s position in the tables
size_t pos;

/// Symbols to encode
enum {
    RC_BIT_0,
    RC_BIT_1,
    RC_DIRECT_0,
    RC_DIRECT_1,
    RC_FLUSH,
} symbols[RC_SYMBOLS_MAX];

/// Probabilities associated with RC_BIT_0 or RC_BIT_1
probability *probs[RC_SYMBOLS_MAX];

} lzma_range_encoder;

//上記は構造です。

//以下は関数です

static inline void
rc_bit(lzma_range_encoder *rc, probability *prob, uint32_t bit)
{
rc->symbols[rc->count] = bit;      // problem code line 69
rc->probs[rc->count] = prob;
++rc->count;
}

//エラー:エラーC2440:'=':'uint32_t'から'lzma_range_encoder ::'に変換できません列挙型への変換には明示的なキャスト(static_cast、Cスタイルのキャストまたは関数スタイルのキャスト)が必要です

「ビット」はuint32_tであり、lzma_range_encoder-> symbolに格納(タイプキャスト)する必要がありますが、どういうわけかそれを行うことができません。すべてのp&cを試しました。また、これに関する以前の質問を検索しました(static_castとすべての運がない)

それは私が推測する単純な問題です。しかし、私は2日以来立ち往生しています。助けてください。ありがとう

4

2 に答える 2

1

列挙に名前を追加します。

enum symbol_enum
{
    // ...
} symbols[RC_SYMBOLS_MAX];

次に、それにキャストできます。

rc->symbols[rc->count] = static_cast<lzma_range_encoder::symbol_enum>(bit);

PS。typedefC ++では、構造体やクラスに使用する必要はありません。通常の構造名はそのまま使用できます。

于 2013-03-07T06:38:20.240 に答える
1

C ++ 11では、名前のない列挙型で次のものを使用できます。

enum {
    RC_BIT_0,
    RC_BIT_1,
    RC_DIRECT_0,
    RC_DIRECT_1,
    RC_FLUSH,
} symbols[RC_SYMBOLS_MAX];

rc->symbols[rc->count] = 
static_cast<std::decay<std::decltype(*symbols)>::type>(bit);
于 2013-03-07T06:41:01.227 に答える