2013-04-30 60 views
7

我正在使用gcc和-std = C++ 11标志。在我的班级定义中,我有以下几点:在switch语句中使用const int变量

private: 
    const int January  = 1, 
       February = 2, 
       March  = 3, 
       ... 

在我的实现中,我有一个switch语句。

switch (currentMonth) 
{ 
    case January: 
     returnString = "January"; 
     break; 
    case February: 
     returnString = "February"; 
     break; 
    case March: 
     returnString = "March"; 
     break; 
    ... 

这看起来像它应该工作,因为月是恒定的;然而,海湾合作委员会给我

calendar.cpp:116:12: error: ‘this’ is not a constant expression 

对每个case switch语句..为什么这是错误的?

+0

该线在你的例子是'116',它是不是在一个如果分配?或者'switch'本身的情​​况? – 2013-04-30 22:55:40

+0

我编辑的帖子更清晰 – kennycoc 2013-04-30 22:58:35

回答

11

非静态类成员不是常量表达式。试试这个:

static constexpr int January = 1; 
+1

+1,这可能是。注意,对于C++ 03兼容的东西,'static const int January = 1;'也可以。 – 2013-04-30 22:58:16

+0

我对'static'关键字并不熟悉,但我的印象是使用'new'创建一个静态对象;那么这是否意味着这与使用'new'相同?这意味着在我的析构函数中,我需要在每个函数上调用delete?或者是完全不同的? – kennycoc 2013-04-30 23:03:12

+6

@kennycoc:不,使用'new'不会创建静态对象,您从哪里听到的? – 2013-04-30 23:18:54

2

试试这个:

enum { 
January = 1, 
February = 2 
... 
}; 
+0

更好的是,尝试一些可以编译的东西。 – 2013-04-30 22:57:18

+0

我现在没有访问权限,这不起作用? – 2013-04-30 22:58:06

+0

'enum int'应该只是'enum'(或者在C++ 11中,也许是'enum:int',如果你由于某种原因特别希望底层类型是'int'),并且它需要一个分号宣言。 – 2013-04-30 23:01:22