c++ - `const int <variable>` 不能出现在常量表达式中

标签 c++ static constants

我有以下声明:

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++ 中,请为 ma​​cros 保留所有大写名称,例如 HELLO。这样您就可以减少不需要的名称冲突和文本替换,并且代码也变得更加美观。即,在 C++ 中使用名称 hello,或 Hello,或...

在某些语言(尤其是 Java 和 Python)中,所有大写字母都用作常量名称的约定,这主要是因为在原始 C 中,常量必须表示为宏。

在这些语言中,所有大写字母除了让人眼前一亮之外没有任何不良影响,但 C++ 确实有一个预处理器。

关于c++ - `const int <variable>` 不能出现在常量表达式中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22318787/

相关文章:

c++ - 从文件初始化静态常量成员

c++ - 可移植 C++ 构建系统

c++ - C++ 中的 vector 迭代和删除

C++ 静态数组

php - PHP 中静态方法的构造函数替代方案

javascript - 创建任何对象(包括深层属性)的只读/不可变副本

c++ - C++运算符重载错误:在只读对象中分配成员“”

c++ - 将数据从 vector 推回到 map 的 vector

java - Java 枚举中的静态(和最终)字段初始化

函数声明中的 C++ const 变量