C++ 映射代理迭代器冲突C++;20迭代器概念

C++ 映射代理迭代器冲突C++;20迭代器概念,c++,iterator,c++20,c++-concepts,C++,Iterator,C++20,C++ Concepts,我试图编写一个包装类,将std::vector解释为整数到Ts的映射。因为我希望它的行为像一个映射,所以它的迭代器应该去引用(键,值)对。因为内存中没有这样的对,所以我对应的迭代器类的reference类型有点非常规: 使用value\u type=std::pair; 使用reference=std::pair; 对于相应的常量迭代器,它变为 使用value\u type=std::pair; 使用reference=std::pair; 然而,现在,我的常量迭代器不再满足std::int

我试图编写一个包装类,将
std::vector
解释为整数到
T
s的映射。因为我希望它的行为像一个
映射
,所以它的迭代器应该去引用
(键,值)
对。因为内存中没有这样的对,所以我对应的迭代器类的
reference
类型有点非常规:

使用value\u type=std::pair;
使用reference=std::pair;
对于相应的
常量迭代器
,它变为

使用value\u type=std::pair;
使用reference=std::pair;
然而,现在,我的
常量迭代器
不再满足
std::intermediate\u readable
(因此,
std::forward\u迭代器和
std::random\u access\u迭代器
)因为

在'struct std::common_reference'中没有名为'type'的类型
(请参阅)或此处的完整代码:

#包括
#包括
#包括
#包括
使用名称空间std;
模板
结构向量映射迭代器{
值*_data=nullptr;
尺寸指数=0;
使用value_type=VType;
使用reference=RType;
使用差分类型=ptrdiff t;
使用迭代器\u category=std::随机访问\u迭代器\u标记;
引用运算符*()常量{return{index,*_data};}
_向量映射迭代器和运算符++(){++index;返回*this;}
_向量映射迭代器运算符++(int){向量映射迭代器res=*this;++(*this);返回res;}
布尔运算符==(常量{vector\u map\u iterator&other)常量{return{data==other.data;}
};
模板
使用vmap_迭代器=_向量_映射_迭代器;
模板
使用vmap_const_迭代器=_vector_map_迭代器;
使用I=vmap_const_迭代器;
//静态断言(标准::公共引用);
静态断言(前向迭代器);
模板
结构向量映射{
矢量原始数据;
使用迭代器=vmap_迭代器;
使用常量迭代器=vmap\u常量迭代器;
迭代器begin(){return{{u raw_data.data(),0};}
const_迭代器begin()const{return{{u raw_data.data(),0};}
向量映射(常量初始值设定项列表和lst):_原始数据(lst){};
};
int main(){
常量向量映射int映射={1,2,3};
const auto it=int_map.begin();

难道现在还不清楚问题出在哪里。当你说“breaks”时,你是指概念中断还是编译错误?“这现在打破了std::forward\u迭代器(因此,std::random\u access\u迭代器)的概念,因为人们期望值类型和引用“共享一个公共引用类型”或类似的东西”嗯,不,不是。不是。请提供一个说明问题以及问题中的错误的。在那之前…您非常需要自己的
。在我看来,您的实现也与传统定义不一致:“类型std::iterator_traits::reference必须完全是[1]”T&如果它满足LegacyOutputIterator(它是可变的)[或2)]const T&否则(它是常量),(其中T是由std::iterator\u traits::value\u type表示的类型)
no type named 'type' in 'struct std::common_reference<std::pair<long unsigned int, const int&>&&, std::pair<long unsigned int, const int>&>'