我在保护范围内出现错误'用这个代码。它与本网站上的其他人有一个模糊的相似问题,但我不是在案例中初始化变量,而添加大括号没有区别。
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'
答案 0 :(得分:4)
跳转(包括从switch
跳转到案例)不允许绕过初始化变量的声明,但有限数量的情况除外。
可以转换为块,但不能以初始化绕过声明的方式。一个 程序从具有自动存储持续时间的变量不在范围内的点跳转到a 除非变量具有标量类型,具有普通默认值的类类型,否则它在范围内的点是不正确的 构造函数和一个普通的析构函数,这些类型之一的cv限定版本,或其中一个的数组 在没有初始化器(8.5)的情况下声明前面的类型。
因此,如果你在宣言上有一个初始化者,那绝对是禁止的。
请注意,案例6和7会触发错误,因为如果跳转到案例5,标签是之前声明,所以没有问题。
正如您在另一个答案的评论中已经注意到的那样,在案例5中围绕变量的初始化添加大括号可以解决问题。
答案 1 :(得分:1)
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;
答案 2 :(得分:0)
警告:这不是您问题的直接答案 - 但在重新编写代码时可能会有所帮助。
根据您的案例5的代码,您似乎只需要选择最小项目(根据各种衡量方法之一)并将其放入opsThatCanWork[0]
如果是这种情况,您可以使用std::min_element
代替std::sort
来提高所有其他情况(我的意思是5除外)的代码运行速度。 std::sort
花费了相当多的时间将所有项目按顺序排列,但您显然只关心找到一个元素。这正是std::min_element
设计的工作。
至少乍一看,它看起来像你的案例5的代码也可能有一个错误。所有其他案例只是重新排列opsThatCanWork
中的现有元素。但是,案例5的代码用其他一些随机值覆盖现有的第一个值。如果您只执行一次此代码,并且不再需要该数组/向量,那么这可能没问题 - 但如果您再次使用该向量中的数据,那么每次执行案例5的代码,您将丢失另一个数据项(并最终得到两个相同的项)。重复几千次,你的数组可能包含N个单个值而不是N个值的副本。
您可能希望通过使用随机选择的元素交换opsThatCanWork[0]
而不是覆盖它来解决此问题。