我使用的是 Visual Studio 2008,有两个类 Parent 和 Child。 Parent在头文件中声明了一些静态const变量,然后在cpp文件中定义这些变量。当我尝试在子类的 switch 语句中使用定义作为 case 时,出现错误:C2051: case 表达式不是常量。所以我做了一些测试,我看到的行为有些不一致。
// Parent.h
class Parent
{
public:
Parent();
~Parent(void) { }
static const unsigned long A = 1;
static const unsigned long B;
};
// Parent.cpp
#include "Parent.h"
const unsigned long Parent::B = 2;
Parent::Parent()
{
// Everything works fine here
unsigned long l;
switch(l)
{
case A:
break;
case B:
break;
default:
break;
}
}
// Child.h
#pragma once
#include "Parent.h"
class Child :
public Parent
{
public:
Child(void);
virtual ~Child(void) { }
static const int C = 3;
static const int D;
};
// Child.cpp
#include "Child.h"
const int Child::D = 4;
Child::Child(void)
{
unsigned long l;
switch(l)
{
case A:
break;
case B: // C2051: case expression not constant
break;
case C:
break;
case D:
break;
default:
break;
}
}
我也尝试过指定Parent::B
直接,这并不能解决问题。除了变量从父类继承时之外,是否有某种原因导致表达式在所有情况下都是恒定的?
你只能使用一个static const
常量表达式中的整型成员变量 if
- 它用常量表达式初始化并且
- 该常量表达式在使用时是可见的。
In your switch
, 的价值Parent::A
是可见的,因为它的初始值设定项位于 Parent.h 头文件中。同样适用于Child::C
。的价值Child::D
是可见的,因为它的初始值设定项出现在 Child.cpp 的较早位置。
然而,价值Parent::B
不可见:C++源文件是单独编译的,因此在编译Child.cpp时,编译器知道Parent::B
is a static const
整数类型的成员变量,但它不知道它的值是什么。因此,它不能用在 Child.cpp 中的常量表达式中。
请注意,如果您曾经使用过Parent::A
作为一个对象(例如,&Parent::A
),您仍然需要定义B
在 Parent.cpp 中,使用const unsigned long Parent::A;
,没有初始化程序,因为您将初始化程序放在类定义中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)