C++ 切换到受保护的范围C++;xcode
我用这段代码得到了“switch in protected scope error”。这是一个模糊的类似问题,在这个网站上的一些其他人,但我不是初始化一个案件中的变量,并添加大括号没有什么区别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 (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号。你知道这是为什么吗?为什么你发布的代码中有大量不必要的缩进?难道就懒得把它拿走吗?没关系;我懒得为你修好它