我在以下代码中有一个奇怪的错误:
float Student::getAverageMark() const throw (NoMarkException)
{
int sum = 0;
int count = 0;
for(map<string, float>::iterator iter = marks.begin(); iter != marks.end(); ++iter) {
sum += iter->second;
count++;
}
return sum/count;
}
正如您所看到的,它没有什么不同寻常的,它是一个计算地图中平均标记的简单代码。我在一个在线编译器中对它进行了测试并且它有效,但是当我尝试在我的机器上编译它时(我正在使用带有GNU GCC编译器的CodeBlocks)我得到了这个错误:
错误:从'std :: map,float&gt; :: const_iterator转换{aka std :: _ Rb_tree_const_iterator,float&gt; &gt;}'到非标量类型'std :: map,float&gt; :: iterator {aka std :: _ Rb_tree_iterator,float&gt; &gt;}'要求|
答案 0 :(得分:10)
你有一个const函数试图迭代我假设的成员变量(标记)。 确保使用const迭代器:
for(map<string, float>::const_iterator iter = marks.begin();
答案 1 :(得分:2)
other answer显示了如何修复错误,但这是使用std::accumulate
计算平均值的另一种方法。使用这种方法,您不必担心迭代器类型等,也可以消除循环。
float Student::getAverageMark() const throw (NoMarkException)
{
if(marks.empty()) {
return 0;
}
return std::accumulate(marks.begin(), marks.end(), 0.0f,
[](float acc, decltype(marks)::value_type const& elem) {
return acc + elem.second;
}) / marks.size();
}
此外,exception specifications已被弃用。