error C2039: “iterator_category”: 不是“Degree”的成员

遇到错误C2039: "iterator_category": 不是"Degree"的成员,尝试了各种解决办法如避免重名,但问题并未解决。最终发现错误在于使用优先级队列时,参数应为指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天真的是十分郁闷,遇到这个名为error C2039: “iterator_category”: 不是“***”的成员,上网谷哥、度娘了一番,得到的结果全是说可能是用的某个名字与库中的重合了,结果试了整整的一个下午加晚上,验证了所有的名字之后,发现问题不是这样的!!!

改后代码:

//vector<Degree> deg;//用来描述从源点source到v的最短路径上权值的上界
Degree* deg = new Degree[MAXSIZE];

priority_queue<Degree, vector<Degree>, cmp> Q(deg, deg + MAXSIZE); 

改前代码:

vector<Degree> deg;//用来描述从源点source到v的最短路径上权值的上界

priority_queue<Degree, vector<Degree>, cmp> Q(deg[0], deg[MAXSIZE]; 
错误提示:

1>------ 已启动生成: 项目: Dijkstra, 配置: Debug Win32 ------
1>  main.cpp
1>d:\program files\microsoft visual studio 10.0\vc\include\xutility(373): error C2039: “iterator_category”: 不是“Degree”的成员
1>          c:\users\chenhq\desktop\dijkstra\dijkstra\degree.h(4) : 参见“Degree”的声明
1>          d:\program files\microsoft visual studio 10.0\vc\include\vector(550): 参见对正在编译的类 模板 实例化“std::iterator_traits<_Iter>”的引用
1>          with
1>          [
1>              _Iter=Degree
1>          ]
1>          d:\program files\microsoft visual studio 10.0\vc\include\queue(247): 参见对正在编译的函数 模板 实例化“std::vector<_Ty>::vector<_Iter>(_Iter,_Iter)”的引用
1>          with
1>          [
1>              _Ty=Degree,
1>              _Iter=Degree
1>          ]
1>          c:\users\chenhq\desktop\dijkstra\dijkstra\dijkstra.h(20): 参见对正在编译的函数 模板 实例化
### `std::allocator_traits` 与 `std::iterator_traits` 的区别及各自作用 在 C++ STL 中,`std::allocator_traits` 和 `std::iterator_traits` 是两个用于泛型编程的重要工具,它们分别服务于不同的目的。 #### `std::allocator_traits` `std::allocator_traits` 是用于封装和抽象内存分配器行为的模板类。它提供了一种统一的方式来访问分配器的特性,如内存分配、释放、对象构造与析构等操作。通过 `std::allocator_traits`,容器可以独立于具体的分配器实现,从而支持用户自定义分配器[^2]。 例如,标准容器(如 `vector`)通常使用 `std::allocator_traits<Allocator>` 来获取分配器的接口: ```cpp template <class T, class Allocator = std::allocator<T>> class vector { using allocator_type = Allocator; using traits = std::allocator_traits<allocator_type>; }; ``` `std::allocator_traits` 提供了默认实现,使得即使分配器未显式定义某些类型别或函数,也能通过默认方式完成内存管理[^2]。 #### `std::iterator_traits` `std::iterator_traits` 是用于萃取迭代器特性的模板结构体,它允许算法和容器在不关心具体迭代器类型的情况下访问其关联类型,如 `value_type`、`difference_type`、`pointer`、`reference` 和 `iterator_category` 等。这一机制是泛型编程中类型萃取(type traits)的经典用[^3]。 例如,以下是一个典型的 `iterator_traits` 定义: ```cpp template <typename Iterator> struct iterator_traits { using value_type = typename Iterator::value_type; using difference_type = typename Iterator::difference_type; using pointer = typename Iterator::pointer; using reference = typename Iterator::reference; using iterator_category = typename Iterator::iterator_category; }; ``` 对于原生指针,也提供了偏特化版本以使其兼容: ```cpp template <typename T> struct iterator_traits<T*> { using value_type = T; using difference_type = ptrdiff_t; using pointer = T*; using reference = T&; using iterator_category = std::random_access_iterator_tag; }; ``` 该机制确保了算法可以一致地处理各种类型的迭代器,包括类类型迭代器和原生指针。 --- ### 主要区别总结 | 特性 | `std::allocator_traits` | `std::iterator_traits` | |------|--------------------------|-------------------------| | 目的 | 封装内存分配器的行为 | 萃取迭代器的关联类型 | | 使用场景 | 容器内部进行内存管理 | 算法和容器访问迭代器属性 | | 类型萃取 | 提供分配器相关操作的默认实现 | 提供迭代器类型信息的访问 | | 对自定义的支持 | 支持用户自定义分配器 | 支持用户自定义迭代器 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值