C++11 C++;InterlocatedCompareeExchange 16的短枚举问题(使用VS2012)

C++11 C++;InterlocatedCompareeExchange 16的短枚举问题(使用VS2012),c++11,enums,volatile,interlocked,static-assert,C++11,Enums,Volatile,Interlocked,Static Assert,已引用此问题: 在我的代码中,我有效地: enum class STATE : short { EMPTY, PRESENT, PARTIAL, }; volatile STATE state; 然后我写一个typedef和一个static\u assert: typedef volatile std::underlying_type<STATE> state_type; static_assert (sizeof (state_type) == size

已引用此问题:

在我的代码中,我有效地:

enum class STATE : short
{
    EMPTY,
    PRESENT,
    PARTIAL,
};

volatile STATE state;
然后我写一个
typedef
和一个
static\u assert

typedef volatile std::underlying_type<STATE> state_type;
static_assert (sizeof (state_type) == sizeof (short), "Error - unsafe for use with InterlockedCompareExchange16");
我从VS2012获得以下错误:

  • 我的
    static\u assert
    失败,抱怨
    state\u type
    的大小与
    short

  • static\u cast
    抱怨它不能从
    volatile STATE*
    转换到
    STATE\u type*

  • 请告诉我如何最好地修复我的代码?

    来自:

    定义成员typedef type,该类型是枚举T的基础类型

    改为:

    typedef typename std::underlying_type<STATE>::type state_type;
                                                //^^^^
    

    这消除了对静态断言的要求,并且不需要任何强制转换。

    谢谢-是的,我自己刚刚发现了这个错误。这修复了一个错误-我仍然收到“静态演员”的抱怨。我将更新该问题。不幸的是,Microsoft编译器给出了错误:C2664:“\u InterlocatedCompareeExchange16”:如果我不执行任何强制转换,则无法将参数1从“volatile STATE*”转换为“volatile SHORT*”。我认为我的核心问题是std::Understanding\u类型的使用不正确。我是否应该结束这个问题,因为它不太可能对其他人有利。请不要根据答案修改这个问题。这会让后来讨论这个问题的人感到困惑,并使答案变得多余。回滚。只是为了承认我的失败,前面提到的错误是由于我错误地使用了“基础类型”,但我仍然收到“静态类型”的抱怨。抱歉@hmjd。我刚刚添加了一个解释性的评论——这足够了吗?
    typedef typename std::underlying_type<STATE>::type state_type;
                                                //^^^^
    
    std::atomic<STATE> state(STATE::EMPTY);
    STATE expected(STATE::EMPTY);
    if (state.compare_exchange_strong(expected, STATE::PRESENT))
    {
        // 'state' set to 'PRESENT'.
    }