|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
算是解决一个bug又出现了新的bug吧。。
起因是想写一个小游戏,为了能方便地遍历所有的Object,在Obj基类的构造函数中添加了一个把自身的指针加入一个set的语句;
然后发现在调用基类的构造函数时,因为类并没有构造完成,多态没有启用,所以set的排序没法实现。。
于是想重新实现一个能排序的set,
想法是两个set,一个未排序完成的,一个排序完成的;
添加元素时,全部添加到未排序完成的set中,
在调用时才把元素全部移动到排序完成的set中
代码是这样的
PostSortSet.h
- #pragma once
- //PostSortSet.h
- //后排序set
- //插入的元素是无序的,在调用时才进行排序;
- //解决在基类的构造函数中,将自身的指针插入集合时,因多态尚未启用,无法正确排序的问题;
- #include <set>
- template <typename T, typename _SortT = std::less<T>>
- class PostSortSet{
- private:
- std::set<T> unsorted;
- std::set<T, _SortT> sorted;
- void sort();
- public:
- void insert(T);
- void erase(T);
- std::iterator begin();
- std::iterator end() {
- this->sort(); //end()定义在类中,没有报错
- return sorted.end();
- }
- };
复制代码
PostSortSet.cpp
- #include "PostSortSet.h"
- template<typename T, typename _SortT>
- inline void PostSortSet<T, _SortT>::sort()
- {
- if (unsorted.empty()) return;
- for (auto i : unsorted) {
- sorted.insert(i);
- }
- unsorted.clear();
- }
- template<typename T, typename _SortT>
- void PostSortSet<T, _SortT>::insert(T t)
- {
- unsorted.insert(t);
- }
- template<typename T, typename _SortT>
- void PostSortSet<T, _SortT>::erase(T t)
- {
- unsorted.erase(t);
- sorted.erase(t);
- }
- template<typename T, typename _SortT>
- inline std::set<T, _SortT>::iterator PostSortSet<T, _SortT>::begin() { //begin()定义在类外,报错:
- //缺少类模板std::iterator的参数列表
- //声明与 "std::iterator<_Category, _Ty, _Diff, _Pointer, _Reference> PostSortSet<T, _SortT>::begin()" 不兼容
-
- //把std::iterator改为std::set<T,_SortT>::iterator后仍然报错
- //在依赖上下文中使用"typename"关键字将非类型"std::set<_Kty,_Pr,_Alloc>::iterator视为类型
- this->sort();
- return sorted.begin();
- }
复制代码
然后发现。。这个begin()和end()的返回类型怎么写都有问题。。。
报错的信息都写在注释中了。。所以这个该怎么改才能行? |
|