BOOL CAssistSliderInfo::UpdateOperationBtnState(const WORD protocolType)
{
switch(protocolType)
{
case CComProtocal::PRO_CHANGE_CTRL_MODE://出错

return TRUE;
break;
case CComProtocal::PRO_TRANS_PHASE://出错

return TRUE;
break;
case CComProtocal::PRO_CHANGE_PHASE_TIME://出错

return TRUE;
break;
default:
break;
} return FALSE;
}class CComProtocal
{
   ................
    ..........
public:
static const WORD   PRO_CUR_TSCM_RTDATA;
static const WORD   PRO_CHANGE_CTRL_MODE
static const WORD   PRO_TRANS_PHASE;
static const WORD   PRO_CHANGE_PHASE_TIME;
}const WORD CComProtocal::PRO_CUR_TSCM_RTDATA = 10001;
const WORD CComProtocal::PRO_CHANGE_CTRL_MODE= 10027;
const WORD CComProtocal::PRO_TRANS_PHASE = 10028;
const WORD CComProtocal::PRO_CHANGE_PHASE_TIME = 10029;编译的时候就通不过,报错如下:
Compiling...
AssistSliderInfo.cpp
E:Tscm\AssistSliderInfo.cpp(576) : error C2051: case expression not constant
E:Tscm\AssistSliderInfo.cpp(580) : error C2051: case expression not constant
E:Tscm\AssistSliderInfo.cpp(584) : error C2051: case expression not constant
E:Tscm\AssistSliderInfo.cpp(590) : warning C4065: switch statement contains 'default' but no 'case' labels
Error executing cl.exe.
Creating browse info file...
Tscm.exe - 3 error(s), 1 warning(s)我都把那些case后面的表达式都定义成了static const 类型了,为什么编译器不能理解为常量?但是如果把这部分:
          switch(protocolType)
{
case CComProtocal::PRO_CHANGE_CTRL_MODE://出错

return TRUE;
break;
case CComProtocal::PRO_TRANS_PHASE://出错

return TRUE;
break;
case CComProtocal::PRO_CHANGE_PHASE_TIME://出错

return TRUE;
break;
default:
break;
}放到CComProtocal的一个成员函数中就不会有任何问题。请问这是怎么回事啊???

解决方案 »

  1.   

    用枚举类型吧
    enum{PRO_CHANGE_CTRL_MODE=100027,...};
      

  2.   

    或者用#define,不过用enum更好一些
      

  3.   

    你的const只在一个对象的生存期内是常量,对整个类来说不是常量
    class A
    {…
      A(int pro);
      const int PRO_CUR_TSCM_RTDATA;
    };
    A::A(int pro) : PRO_CUR_TSCM_RTDATA(pro) // 初始化常量
    {
     …
    }
    A  a1(100); // 对象 a1 的PRO_CUR_TSCM_RTDATA值为100
    A  a2(200); // 对象 a2 的PRO_CUR_TSCM_RTDATA值为200
    如想建立整个类的常量使用enum
    class A
    {
      enum(PRO_CUR_TSCM_RTDATA  = 10000...);
    }
      

  4.   

    case 后面必须使用常量,不能是可变量
      

  5.   

    case 后面必须使用常量,不能是可变量
    补充:并且只能是整形常量
      

  6.   

    switch(protocolType)
    {
    case 50://
    return TRUE;
    break;
    case 100://

    return TRUE;
    break;
    case 200://

    return TRUE;
    break;
    default:
    break;
    }
      

  7.   

    RE:
    baodi_z(冷冷的太阳) & bobob(静思--潜心研究PDF) ,谢谢!
    问题是我已经定义肋static const 了啊,难道还不是常量吗?
    要知道我这样使用根本不会有问题:
    BOOL CComProtocal::UpdateOperationBtnState(const WORD protocolType)
    {
    switch(protocolType)
    {
    case PRO_CHANGE_CTRL_MODE:

    return TRUE;
    break;
    case PRO_TRANS_PHASE:

    return TRUE;
    break;
    case PRO_CHANGE_PHASE_TIME:

    return TRUE;
    break;
    default:
    break;
    } return FALSE;
    }但是在CAssistSliderInfo里像楼顶那样使用就出问题了,
    至于寻找解决办法(譬如用enum,或者case后直接用数值等办法我当然知道),我在这里问的问题是想知道为什么会造成这种情况,我的疑问是:在一个类中(如CComPotocal)定义的静态常量,在另一个类(CAssistSliderInfo)看来就不是常量了吗?我感到奇怪!!!
      

  8.   

    return TRUE;//
    break;//不需要
      

  9.   

    类中的 static const 成员变量必须在定义的时候初始化 !class CComProtocal
    {
       ................
        ..........
    public:
    static const WORD   PRO_CUR_TSCM_RTDATA = 10001;
    static const WORD   PRO_CHANGE_CTRL_MODE = 10027;
    static const WORD   PRO_TRANS_PHASE = 10028;
    static const WORD   PRO_CHANGE_PHASE_TIME = 10029;
    }