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;
}

//Error: error C2440: '=' : cannot convert from 'uint32_t' to 'lzma_range_encoder::' Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)

'bit' 是 uint32_t,需要存储(类型转换)在 lzma_range_encoder->symbols 中,但我无法以某种方式做到这一点。尝试了每一个 p&c。此外,搜索了有关此的早期问题(static_cast 和所有但没有运气)

我猜这是一个简单的问题。但我被困住了两天。请帮忙。谢谢

4

2 回答 2

1

为枚举添加名称:

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

然后你可以投射到它:

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

PS。在 C++ 中,您不需要typedef用于结构或类。正常结构名称可以按原样使用。

于 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 回答