C++ 切换到受保护的范围C++;xcode

C++ 切换到受保护的范围C++;xcode,c++,switch-statement,case,C++,Switch Statement,Case,我用这段代码得到了“switch in protected scope error”。这是一个模糊的类似问题,在这个网站上的一些其他人,但我不是初始化一个案件中的变量,并添加大括号没有什么区别 switch (switchval){ case 1: sort(opsThatCanWork.begin(), opsThatCanWork.end(), sortByDurationLow);

我用这段代码得到了“switch in protected scope error”。这是一个模糊的类似问题,在这个网站上的一些其他人,但我不是初始化一个案件中的变量,并添加大括号没有什么区别

                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;


            }
错误出现在状态为“case 6”和“case 7”的行上,不允许跳转(包括从
开关到case的跳转)绕过初始化变量的声明,除非在有限的情况下

                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;
可以传输到块中,但不能以通过初始化绕过声明的方式传输。A. 从具有自动存储持续时间的变量不在范围内的点跳到 除非变量具有标量类型、类类型和一个微不足道的默认值,否则它在作用域中的点是格式错误的 构造函数和普通析构函数、这些类型之一的cv限定版本或其中一个类型的数组 前面的类型和声明没有初始值设定项(8.5)

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

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

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

跳转(包括从
开关
跳转到案例)不允许绕过初始化变量的声明,除非在有限的案例中

可以传输到块中,但不能以通过初始化绕过声明的方式传输。A. 从具有自动存储持续时间的变量不在范围内的点跳到 除非变量具有标量类型、类类型和一个微不足道的默认值,否则它在作用域中的点是格式错误的 构造函数和普通析构函数、这些类型之一的cv限定版本或其中一个类型的数组 前面的类型和声明没有初始值设定项(8.5)

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

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


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

警告:这不是对您的问题的直接回答,但它可能有助于将代码重新构造得更好

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

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

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


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

警告:这不是对您的问题的直接回答,但它可能有助于将代码重新构造为更好的一点

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

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

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


您可能希望通过使用随机选择的元素交换
opthatcanwork[0]
而不是覆盖它来解决这个问题。

Ah谢谢,案例5周围的大括号解决了这个问题。这让我很恼火,那里没有错误,但在6号和7号。知道为什么吗?啊,谢谢,案例5的支架解决了这个问题。这让我很恼火,那里没有错误,但在6号和7号。你知道这是为什么吗?为什么你发布的代码中有大量不必要的缩进?难道就懒得把它拿走吗?没关系;我懒得为你修好它