可能这个问题无关紧要,但是我还是想说说自己的看法. Author: Crazii @ CSDN
迭代器的类型跟容器类型相关.但是,容器的类型参数(模板参数)有很多,其中有些是跟容器和迭代器的使用无关的.
例如std::map<std::string,int,std::greater<std::string>>的迭代器,与std::map<std::string,int,std::less<std::string>>的迭代器,理论上是可以通用的,因为迭代器跟容器的排序比较细节无关,它只与类型相关.容器本身也该如此,将内部的细节隐藏.
因此我个人认为以下处理应该是合法的:
MAP<keytype,valuetype> map0;
MAP<keytype,valuetype,CMP_FUNTOR1> map1;
MAP<keytype,valuetype,CMP_FUNTOR2> map2(map0); //构造合法 legal ctor
或者 MAP<keytype,valuetype,CMP_FUNTOR2> map2 = map1; //构造合法 legal
map2 = map0; //赋值合法 //legal op=
map2 = map1; //赋值合法 //legal
MAP<keytype,valuetype>::ITERATOR iter;
TYPEOF(MAP<keytype,valuetype>::ITERATOR) = TYPEOF(MAP<keytype,valuetype,CMP_FUNTOR1>::ITERATOR) = TYPEOF(MAP<keytype,valuetype,CMP_FUNTOR2>::ITERATOR)//迭代器类型与容器比较器无关.
故有
iter = map0.begin();
iter = map1.begin(); //合法 //legal
iter = map2.begin(); //合法 //legal
而在容器的类型不同时,当然不能够在容器间相互赋值,迭代器也不应该能通用.如
MAP<keytype_differ,valuetype_differ> map3(map0); //这个是非法的 illegal ctor
map3 = map0; //这也是非法. illegal op=
iter = map3.begin(); //非法 illegal