14

私はいくつかの静的constメンバーの次の宣言を持っています

.h

class MyClass : public MyBase
{
public:
    static const unsigned char sInvalid;
    static const unsigned char sOutside;
    static const unsigned char sInside;
    //(41 more ...)
}

.cpp

const unsigned char MyClass::sInvalid = 0;
const unsigned char MyClass::sOutside = 1;
const unsigned char MyClass::sInside = 2;
//and so on

ある時点で、これらの値を次のようなスイッチで使用したいと思います。

unsigned char value;
...
switch(value) {
    case MyClass::sInvalid : /*Do some ;*/ break;
    case MyClass::sOutside : /*Do some ;*/ break;
    ...
}

しかし、次のコンパイラエラーが発生します。エラー:'MyClass::sInvalid'は定数式に表示できません

static const unsigned char私は他のswitch-cannot-appear-constant-stuffを読みましたが、それらが定数式ではない理由がわからないため、答えが見つかりませんでした。

gcc4.5を使用しています。

4

3 に答える 3

19

あなたが見る問題はこれが

static const unsigned char sInvalid;

コンパイラはその値を知らないため、コンパイル時定数式にすることはできません。次のようにヘッダーで初期化します。

class MyClass : public MyBase
{
public:
    static const unsigned char sInvalid = 0;
    ...

そしてそれは動作します。

于 2012-05-16T13:06:35.993 に答える
9

値は確かにですが、コンパイル時定数constではありません。

条件は、switch実行時ではなく、コンパイル時に解決されます。sInvalid1回だけであれば、任意の値に初期化でき、switch実行時までその値を知ることはありません。

定数enumの代わりにsを使用する方が良いようです。staticそれが機能するという事実に加えて、それは設計的にはより適切であるように思われます。

于 2012-05-16T13:04:54.760 に答える
2

enum トリックを使用して、コンパイル時の定数にすることができます。

class MyClass 
{
public:
    enum {
        sInvalid,
        sOutside,
        sInside,
        //(41 more ...)
    };
};

コードでは、列挙型を使用して、次のように unsigned char に代入できます。

int main(int argc, char *argv[])
{
    unsigned char buf[32];
    buf[0] = MyClass::sInvalid; //int to unsigned char
    return buf[0]; //Cast back to int (and avoid a warning a -Wall)
}

そしてMyClass::sInvalid、あなたのswithステートメントで使用してください。

于 2012-05-16T13:35:33.923 に答える