通过引用传递由非常量迭代器指向的值

Pass value pointed by non-const iterator by reference c++

本文关键字:迭代器 常量 非常 引用      更新时间:2023-10-16

我有一个std::set<MyType>容器,我是通过某个类的get函数获得的,也就是说,我有这样的东西:

typedef std::set<MyType, compareMyType> MyTypeSet;  
// this a singleton class
class MyClass {  
...  
public:  
    MyTypeSet& getMySet() { return mySet_; }  
...  
private:  
MyTypeSet mySet_;  
...  
}  

然后在另一个地方我使用这个容器:

MyClass obj;
MyTypeSet& mySet = mtyObj->getMySet();
MyTypeSet::iterator itBeg = mySet.begin();
// Then I'm trying to call f function
f(*itBeg);

其中f函数的签名如下:

void f(MyType& param);

我得到这样的编译错误:

note: candidates are: void f(MyType&)
error: no matching function for call to f(const MyType&)

我该如何解决这个问题?

在不了解您的环境细节的情况下,我猜您的系统对set的实现试图通过将iterator混叠为const_iterator来"安全"(这样您就不会试图通过迭代器修改集合项,这是危险的,因为它可能会改变排序顺序)。

如果是这样,那么最简单的修复方法就是按照编译器的建议将函数的签名更改为void f(const MyType& param)。如果您确实需要修改参数(以不改变排序顺序的方式),有各种方法可以绕过const限制(包括使用const_cast或上面链接中建议的解决方案),但我建议谨慎进行。