zoukankan      html  css  js  c++  java
  • case expressions must be constant expressions

    As the error message states, the case expressions must be constant. The compiler builds this as a very fast look-up table at compile time and it can't do that if there is a possibility that the values could change as the program runs.

    If you do need them to be variable, not constant, your best bet is to use if/else statements instead.

    方法一:

    The case statements require integral value which must be known at compile-time, which is what is meant by constant here. But the const members of a class are not really constant in that sense. They're are simply read-only.

    Instead of fields, you can use enum :

    class ThisClass
    {
        public:
    
            enum Constants
            {
                EXAMPLE_CONSTANT = 10,
                ANOTHER_CONSTANT = 20
            };    
    };

    And then you can write,

    switch(c)
    {
          case ThisClass::EXAMPLE_CONSTANT:
                       //code
                       break;
          case ThisClass::ANOTHER_CONSTANT:
                       //code
                       break;
    };

    I am getting a 'case expression not constant' error in a switch statement. However, the header provides a definition for the used constants, and the constructor provides initialisation for them in its initialization list.

    Additionally, when I mouse over the "problem" statements it identifies them as constants.

    const int ThisClass::EXAMPLE_CONSTANT
    
    error expression must have a constant value

    This seems a little counter-intuitive to me. I did some research and found a similar problem that someone else had. They were told that all constants must in fact be initialised in 'main' and that this was a limitation of the language. Is this really the case? It seems unlikely.

    You need a "real" compile time integer constant. const in C++ means read-only, and a const variable can be initialized just like int y = 0; const int x = y;, making x a read-only copy of the value y had at the time of initialization.

    With a modern compiler, you can either use enums or constexprs to store (integral) members of compile-time-constness:

    class Foo {
    public:
        static constexpr int x = 0;
        enum { y = 1 };
    };
    
    int main () {
        switch (0) {
        case Foo::x: ;
        case Foo::y: ;
        }
    }

    其它: http://www.cplusplus.com/forum/beginner/74845/

  • 相关阅读:
    linux 自定义简单脚本文件
    An internal error occurred during: "Building workspace". GC overhead limit exceeded
    springmvc 接受参数
    Content-type 的几种类型
    vue.js实战 第一篇 第七章 组件详解_组件与复用
    vue.js实战 第一篇 第六章 表单与v-model
    vue.js实战 第一篇 第五章 内置指令
    node.js入门1
    vue.js实战 第一篇 第四章 v-bind及class与style绑定
    vue.js实战 第一篇 1-3章计算属性
  • 原文地址:https://www.cnblogs.com/timssd/p/6694613.html
Copyright © 2011-2022 走看看