在受保护的范围内切换C++ xcode

Switch in protected scope C++ xcode

本文关键字:C++ xcode 范围内 受保护      更新时间:2023-10-16

我收到此代码的"受保护范围内的开关错误"。这是一个与本网站上其他一些问题大致相似的问题,但是我没有初始化案例中的变量,添加大括号没有区别。

                switch (switchval){
                case 1:
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByDurationLow);  //chooses op with smallest duration
                    break;
                case 2:
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByDurationHigh);  //chooses op with biggest duration
                    break;
                case 3:
                    //chooses op with lowest total job time remaining - need to calculate these
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByRemainingJobTimeLow);
                    break;
                case 4:
                     //chooses op with lowest total job time remaining - need to calculate these
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByRemainingJobTimeHigh);
                    break;
                case 5:
                    //this chooses randomly!
                    int randVal = round(randomGen(-0.49999, opsThatCanWork.size()-1+0.49999));
                    opsThatCanWork.at(0) = opsThatCanWork.at(randVal);
                    break;
                case 6:
                    //first in the quene for a machine
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByStartTimeLow);
                    break;

                case 7:
                    sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByStartTimeHigh);
                    break;

            }

错误位于声明"案例 6"和"案例 7"的行上

不允许跳转(包括从 switch 跳转到大小写)绕过初始化变量的声明,除非在有限数量的情况下。

可以转移到块中,但不能绕过初始化声明的方式。一个 从具有自动存储持续时间的变量不在范围内的点跳转到 它在作用域中的点格式不正确,除非变量具有标量类型,具有普通默认值的类类型 构造函数和简单析构函数、这些类型之一的 CV 合格版本或其中一种的数组 前面的类型,并在没有初始值设定项 (8.5) 的情况下声明。

因此,如果您在声明中有初始值设定项,则绝对禁止使用。

请注意,案例

6 和 7 会触发错误,因为如果跳转到案例 5,标签位于声明之前,因此没有问题。

正如您在对另一个答案的评论中已经指出的那样,在案例 5 中变量的初始化周围加上大括号可以解决问题。

                case 5:
                //this chooses randomly!
----------------V variable initialization
                int randVal = round(randomGen(-0.49999, opsThatCanWork.size()-1+0.49999));
                opsThatCanWork.at(0) = opsThatCanWork.at(randVal);
                break;

警告:这不是对你的问题的直接回答 - 但它很可能有助于重组代码以使其更好。

根据案例 5 的代码,您似乎只需要选择最小的项目(根据各种测量方法之一)并将其放入opsThatCanWork[0]

如果是这种情况,您可以通过使用 std::min_element 而不是 std::sort 来提高所有其他情况(我的意思是 5 种除外)的代码运行速度。 std::sort花费了相当多的时间将所有项目整理好,但您显然只关心找到一个元素。这正是std::min_element的设计目的。

至少乍一看,在我看来,您的案例 5 代码也可能有一个错误。所有其他情况只是重新排列opsThatCanWork中的现有元素。但是,案例 5 的代码用其他一些随机值覆盖现有的第一个值。如果您只执行此代码一次,并且不再需要该数组/向量,那么这可能没问题 - 但是如果您再次使用该向量中的数据,则每次执行案例 5 的代码时,您都会丢失另一个数据项(并最终得到两个相同的项)。重复几千次,数组可能包含单个值的 N 个副本,而不是 N 个值。

您可能希望通过opsThatCanWork[0]与随机选择的元素交换而不是覆盖它来解决此问题。