免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3260 | 回复: 9
打印 上一主题 下一主题

[C++] 一个模板类的参数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-15 21:03 |只看该作者 |倒序浏览
本帖最后由 fengogo008 于 2013-05-15 21:05 编辑

我有一个模板类 Tree,它有几个模板参数,其中一个是自定义的内存分配模板类,该内存分配类有一个模板参数,表示分配的对象大小。
我现在的问题是Allocator = MemPool<sizeof(RBNode) 在编译时引用了尚未定义的RBNode结构体,该怎么办? 不知道我描述清楚了没。
  1. template <typename KeyType, typename ValueType, typename Allocator = MemPool<sizeof(RBNode)> >
  2. class RBTree{

  3.         struct  RBNode{
  4.                 KeyType   k;
  5.                 ValueType v;
  6.         }
  7. };

  8. template <unsigned int unit_size>
  9. class MemPool{
  10. };
复制代码

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-05-15 21:12 |只看该作者
我支持你挪出去.

论坛徽章:
0
3 [报告]
发表于 2013-05-15 21:17 |只看该作者
linux_c_py_php 发表于 2013-05-15 21:12
我支持你挪出去.


其实主要是想类似 RBTree<int,int> tree;  这样透明使用。
用模板是为了可以自定义类型, 如果把结构体挪出去,似乎就不行了。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
4 [报告]
发表于 2013-05-15 21:36 |只看该作者
你看你死脑筋了, 你把node也做成模板不就行了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2013-05-15 22:45 |只看该作者

  1. template <unsigned int unit_size>
  2. class MemPool{
  3. };


  4. template <typename KeyType, typename ValueType,
  5.         template <unsigned int unit_size>
  6.         class AllocatorT = MemPool
  7. >
  8. class RBTree{

  9.        
  10.         struct  RBNode{
  11.                 KeyType   k;
  12.                 ValueType v;
  13.         };
  14.                
  15.         typedef AllocatorT<sizeof(RBNode)> Allocator;
  16.                
  17. };

复制代码

论坛徽章:
0
6 [报告]
发表于 2013-05-16 10:59 |只看该作者
多谢指点,我理解了两位的意思,但是实际编译中还是有点问题。
第一种,在类外定义:
template<class KEY, class VALUE>
class NodeT{
};
template <class KEY, class VALUE, class ALLOCATER=allocate<sizeof(NodeT)(这里编译出错)> >
{
      typedef NodeT<KEY, VALUE>  Node;
};
由于定义NodeT为模板,那么就不能直接sizeof(NodeT)了,而必须把NodeT实例化,但是KEY VALUE等类型还是需要在 Tree类被定义的。
而结点定义移出外面也导致代码比较丑陋。

第二种,在 class AllocatorT = MemPool 这里会编译出错,因为MemPool 模板需要一个固定大小实例化。
而如果不给AllocatorT 默认值,那么后面的
typedef AllocatorT<sizeof(RBNode)> Allocator;  这句类型定义又把所有的Allocator 都固定为一种类似mempool的模板类型了。

模板比较少用,目前我还没想出什么好办法(也不知道按什么关键词google~),或者需要修改Mempool不使用参数模板。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-05-16 11:22 |只看该作者
第一种要写 sizeof(NodeT<KEY,VALUE>)

第二种要用比较完善的编译器,比如gcc;  
vc6肯定是不行的。

论坛徽章:
0
8 [报告]
发表于 2013-05-16 13:37 |只看该作者
本帖最后由 Frahm 于 2013-05-16 13:43 编辑

我的话,会这么做,虽然一定程度上改变了代码含义
  1. template<typename T, typename U>
  2. struct size_of {
  3.   struct _{
  4.     T t;
  5.     U u;
  6.   };
  7.   enum { value = sizeof(_) };
  8. };

  9. template <typename KeyType, typename ValueType, typename Alloc = MemPool<size_of<KeyType, ValueType>::value> >
  10. class RBTree {
  11.   struct RBNode {
  12.          KeyType   k;
  13.          ValueType v;
  14.   };

  15. };
复制代码

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2013-05-16 17:37 |只看该作者
stl的实现都是这种例子

  1. template<class key, class value, class ptr = less<key>, class Alloc = allocator<pair<key, value>>>
  2. class map : public _Tree<_Tmap_traits<key, value, ptr, Alloc, false>>
  3. {
  4.     ....
  5. }
复制代码

论坛徽章:
0
10 [报告]
发表于 2013-05-16 19:50 |只看该作者
随便找个STL容器的源码看看了知道了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP