CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  工具平台和程序库

帮忙看看这个模板的问题出在什么地方??????

楼主bilbo0214(bilbo)2003-09-02 11:45:34 在 C/C++ / 工具平台和程序库 提问

#include<stdio.h>  
  template<class   T>   void   RANGE(char*   name) {  
  T   minval,maxval,bit;  
  unsigned   bits;  
  char   *format;  
  /*Measure   size   of   data   type   in   bits*/  
  bits   =1;  
  bit   =1;  
  while   (bit   <<=1)   bits++;  
  /*signed   or   unsigned?*/  
  if   ((T)(1L<<(bits-1))>0)  
  {  
  format   =   "%12lu";   /*unsigned*/  
  minval   =   (T)0;  
  }  
  else  
  {  
  format   =   "%12ld";   /*signed*/  
  minval   =   (T)(1L<<(bits   -1));  
  }  
  maxval   =   minval   -1;   /*roll   over   backwards*/  
  printf("%20s   (%2u   bits):   ",name,bits);  
  printf(format,(long)minval);  
  printf("   to   ");  
  printf(format,(long)maxval);  
  printf("\n");  
  }  
   
  void   main()  
  {  
  printf("\nTesting   range   of   UNSIGNED   ints...\n\n");  
  RANGE<unsigned   char>("unsigned   char");  
  RANGE<unsigned   short   int>("unsigned   short   int");  
  RANGE<unsigned   int>("unsigned   int");  
  RANGE<unsigned   long   int>("unsigned   long   int");  
   
  printf("\nTesting   range   of   SIGNED   ints...\n\n");  
  RANGE<signed   char>("signed   char");  
  RANGE<signed   short   int>("signed   short   int");  
  RANGE<signed   int>("signed   int");  
  RANGE<signed   long   int>("signed   long   int");  
  }  
   
  可是结果确是所有类型大小都相同,我不清楚模板的错误在什么地方,好像实例化的时候都用的是最后一个实例。  
  请高手指教。  
  谢谢。 问题点数:60、回复次数:8Top

1 楼njtu(天地不容)回复于 2003-09-02 12:35:49 得分 0

奇怪!Top

2 楼oopig(面向对象的猪)回复于 2003-09-02 12:51:46 得分 30

vc6的问题。  
  以下输出都是4  
  template   <typename   T>  
  int   get_size()  
  {  
  return   sizeof(T);  
  }  
  void   main()  
  {  
  cout   <<   get_size<char>()   <<   endl;  
  cout   <<   get_size<unsigned   char>()   <<   endl;  
  cout   <<   get_size<int>()   <<   endl;  
  cout   <<   get_size<unsigned>()   <<   endl;  
  }  
  但是加了一个特化后,输出都是1:  
  template   <>  
  int   get_size<char>()  
  {  
  return   1;  
  }  
  Top

3 楼oopig(面向对象的猪)回复于 2003-09-02 12:53:13 得分 0

dev-c++4.9.8.0没有这个问题  
  Top

4 楼zhurui1979(新手)回复于 2003-09-02 21:57:44 得分 0

确实是只有最后一个起了作用。真是奇怪Top

5 楼sevecol(sevecol.blogone.net)回复于 2003-09-02 22:12:46 得分 10

估计就是VC6的问题了  
  在VC7.1下正常的输出Top

6 楼bilbo0214(bilbo)回复于 2003-09-03 09:19:21 得分 0

可能是,我还需要使用其他编译器验证!  
  谢谢大家!Top

7 楼Wolf0403(废人:独活十年~心如刀割)回复于 2003-09-03 16:49:36 得分 10

Testing   range   of   UNSIGNED   ints...  
   
                unsigned   char   (   8   bits):                         0   to                     255  
      unsigned   short   int   (16   bits):                         0   to                 65535  
                  unsigned   int   (32   bits):                         0   to       4294967295  
        unsigned   long   int   (32   bits):                         0   to       4294967295  
   
  Testing   range   of   SIGNED   ints...  
   
                    signed   char   (   8   bits):                   -128   to                     127  
          signed   short   int   (16   bits):               -32768   to                 32767  
                      signed   int   (32   bits):     -2147483648   to       2147483647  
            signed   long   int   (32   bits):     -2147483648   to       2147483647  
   
  Dev-C++   4980Top

8 楼yjh1982(血精灵)回复于 2003-09-03 17:29:35 得分 10

#include<stdio.h>  
  template<class   T,int   I   >  
    void   RANGE(char*   name) {  
    T   minval,maxval,bit;  
  unsigned   bits;  
  char   *format;  
  /*Measure   size   of   data   type   in   bits*/  
  bits   =1;  
  bit   =1;  
  while   (bit   <<=1)   bits++;  
  /*signed   or   unsigned?*/  
  if   ((T)(1L<<(bits-1))>0)  
  {  
  format   =   "%12lu";   /*unsigned*/  
  minval   =   (T)0;  
  }  
  else  
  {  
  format   =   "%12ld";   /*signed*/  
  minval   =   (T)(1L<<(bits   -1));  
  }  
  maxval   =   minval   -1;   /*roll   over   backwards*/  
  printf("%20s   (%2u   bits):   ",name,bits);  
  printf(format,(long)minval);  
  printf("   to   ");  
  printf(format,(long)maxval);  
  printf("\n");  
  }  
   
  void   main()  
  {  
  printf("\nTesting   range   of   UNSIGNED   ints...\n\n");  
  RANGE<unsigned   char,100>("unsigned   char");//居然还是四字节,比尔.该死  
  RANGE<unsigned   short   int,0>("unsigned   short   int");  
  RANGE<unsigned   int,0>("unsigned   int");  
  RANGE<unsigned   long   int,0>("unsigned   long   int");  
   
  printf("\nTesting   range   of   SIGNED   ints...\n\n");  
  RANGE<signed   char,0>("signed   char");  
  RANGE<signed   short   int,0>("signed   short   int");  
  RANGE<signed   int,0>("signed   int");  
  RANGE<signed   long   int,0>("signed   long   int");  
   
  }  
   
  Top

相关问题

  • 函数模板错在什么地方了~~~
  • 大家给看一下这个模板是什么意思~
  • 模板是干什么的?
  • 看看这个pair模板
  • 高手帮忙看看,为为什么这个数组模板类不行啊
  • 帮忙看看这个模板函数为什么总是出错(vc6.0)
  • vc.net模板与vc6.0模板有什么不同?
  • 为什么队列模板用不了?
  • 为什么要使用模板?
  • 类模板是个什么概念?

关键词

  • c++
  • template
  • vc
  • minval
  • range
  • bit
  • signed
  • unsigned
  • short
  • 问题

得分解答快速导航

  • 帖主:bilbo0214
  • oopig
  • sevecol
  • Wolf0403
  • yjh1982

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo