通过引用c ++传递非const迭代器指向的值

时间:2014-06-26 06:51:17

标签: c++ pointers iterator set

我有一个std::set<MyType>容器,我可以通过获取某个类的功能,即我有一些像这样的东西:
     

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&)

我该如何解决这个问题? 提前谢谢。

1 个答案:

答案 0 :(得分:2)

在不了解您的环境详细信息的情况下,我猜测您的系统set的实施尝试通过将iterator别名为const_iterator来“安全”(这样您就不会尝试通过迭代器修改设置项,这很危险,因为它可能会改变排序顺序)。有关详情,请参阅here

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