3 回答
TA贡献1874条经验 获得超12个赞
其中的对象std::set存储为const StudentT。因此,当您尝试getId()使用const对象调用时,编译器会检测到问题,主要是您在const对象上调用非const成员函数,这是不允许的,因为非const成员函数没有PROMISE不修改对象; 所以编译器会做一个安全的假设,getId()可能会尝试修改对象,但同时,它也注意到对象是const; 所以任何修改const对象的尝试都应该是一个错误。因此编译器会生成错误消息。
解决方案很简单:将函数const设为:
int getId() const {
return id;
}
string getName() const {
return name;
}
这是必要的,因为现在你可以打电话getId()和getName()在const对象为:
void f(const StudentT & s)
{
cout << s.getId(); //now okay, but error with your versions
cout << s.getName(); //now okay, but error with your versions
}
作为旁注,您应该实现operator<为:
inline bool operator< (const StudentT & s1, const StudentT & s2)
{
return s1.getId() < s2.getId();
}
注意参数现在是const参考。
TA贡献1828条经验 获得超6个赞
不修改类实例的成员函数应声明为const:
int getId() const {
return id;
}
string getName() const {
return name;
}
任何时候你看到“丢弃限定符”,它正在谈论const或volatile。
TA贡献2016条经验 获得超9个赞
实际上C ++标准(即C ++ 0x草案)说(tnx to @Xeo&@Ben Voigt指出这一点):
23.2.4关联容器
5对于set和multiset,值类型与键类型相同。对于map和multimap,它等于pair。关联容器中的键是不可变的。
6关联容器的迭代器是双向迭代器类别。对于值类型与键类型相同的关联容器,iterator和const_iterator都是常量迭代器。未指定迭代器和const_iterator是否是同一类型。
因此VC ++ 2008 Dinkumware实现有问题。
老答案:
你得到了这个错误,因为在std lib的某些实现中它set::iterator是相同的set::const_iterator。
例如libstdc ++(随g ++一起提供)有它(在这里查看整个源代码):
typedef typename _Rep_type::const_iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
在SGI的文档中,它指出:
iterator Container Iterator used to iterate through a set.
const_iterator Container Const iterator used to iterate through a set. (Iterator and const_iterator are the same type.)
另一方面,VC ++ 2008 Express编译你的代码而不抱怨你在set::iterators 上调用非const方法。
- 3 回答
- 0 关注
- 684 浏览
添加回答
举报