我有一个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&)
我该如何解决这个问题? 提前谢谢。
答案 0 :(得分:2)
在不了解您的环境详细信息的情况下,我猜测您的系统set
的实施尝试通过将iterator
别名为const_iterator
来“安全”(这样您就不会尝试通过迭代器修改设置项,这很危险,因为它可能会改变排序顺序)。有关详情,请参阅here。
如果是这样,那么最简单的解决方法就是将函数的签名更改为编译器建议的void f(const MyType& param)
。如果确实需要修改参数(以不会改变排序顺序的方式),有很多方法可以绕过const
限制(包括使用const_cast
或上述链接中提出的解决方案),但我建议谨慎行事。