帮忙看看这个模板的问题出在什么地方??????
#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




