由引用集/映射迭代器传递的迭代器不可取消引用



我在通过引用传递迭代器时遇到了一些麻烦。在程序中,我有三个类:包含 std::map> 作为私有成员的类 A。将 A 类作为私有成员持有的 B 类。以及在其构造函数中接收类 B 的类 C。在 C 类中,我尝试检索指向映射的迭代器,如下所示:

class A(){
   private: 
        std::map<std::vector<>> theMap;
   public:
        void theMap_access() {std::string to_access , std::map<std::vector<>>::iterator &it){
        it =  theMap.find(to_access);
        it-> first; //OK
   }         
};
class B(){
   private: 
        A a;
   public: 
        A A_access(){return a;}
};
class C(B &b){
   public: 
       std::map<std::vector<>>::iterator it;
       std::string to_access = "test";
       B.A_access().theMap_access(to_access, it);
       it-> first; //KO
};

当我执行此代码时,我确定"测试"在映射中。因此,当我在类 A 中取消引用它时,代码运行良好,我得到它->first = "test"。但是在通过引用将其传递回 C 类后,我收到此错误:set/map 迭代器不可取消引用。我假设迭代器一旦传回就不会指向它在类 A 中指向的内容.您能否解释我为什么以及如何解决这个问题?非常感谢您的帮助。

我收到此错误:设置/映射迭代器不可取消引用。

这是因为在返回B.A_access时使用的A对象:

B.A_access().theMap_access(to_access, it);

执行上述行后不再存在。 所以你设置的迭代器指的是一个不存在的map,因为那个map也消失了。

原因是该B.A_access()返回A对象的副本,而不是包含您尝试使用std::map的实际A对象。

如果要使用包含要操作std::map的实际A对象,则A_access应返回对A的引用,而不是A的副本。

所以修复应该是:

 A& A_access(){return a;}

最新更新