我有以下声明:
class Rm
{
public:
//defined message types
static const int HELLO;
}
在我的 cpp 文件中:
const int Rm::HELLO = 1;
但是当我尝试在另一个类的方法中使用它时:
int
Rn::ProcessMessages()
{
messagesIter iter = messages.begin();
while(iter != messages.end())
{
switch(iter->first)
{
case Rm::HELLO:
myID = iter->second;
break;
}
}
}
我明白了: 错误:'Rm::HELLO' 不能出现在常量表达式的情况下 Rm::HELLO:
我做错了什么?
最佳答案
为了在 switch
中使用 HELLO
值,此时编译器需要知道它。本质上,对于整数类型的成员常量,意味着在声明中提供初始化值。因此,而不是
static const int HELLO;
做
static const int HELLO = -1;
尽管有初始化程序,这仍然只是一个纯声明。如果您使用此地址,则需要单独的定义。只是不要拿地址。
以上适用于整数类型,但由于未知原因,即使是 double
成员常量也不能以这种方式定义。一种替代方法是使用 C++11 constexpr
,但此时限制了代码的可移植性。非整型常量的 C++03 替代方案包括
使用 namespace 级别常量,而不是成员。
使用产生(引用)值的函数。
在类模板中定义常量,从特化派生您的类。
最后一点,在 C++ 中,请为 macros 保留所有大写名称,例如 HELLO
。这样您就可以减少不需要的名称冲突和文本替换,并且代码也变得更加美观。即,在 C++ 中使用名称 hello
,或 Hello
,或...
在某些语言(尤其是 Java 和 Python)中,所有大写字母都用作常量名称的约定,这主要是因为在原始 C 中,常量必须表示为宏。
在这些语言中,所有大写字母除了让人眼前一亮之外没有任何不良影响,但 C++ 确实有一个预处理器。
关于c++ - `const int <variable>` 不能出现在常量表达式中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318787/