因在模板函数中使用new分配内存,总是不对,后写了这样一段代码测试
template <typename T>
unsigned tt()
{
return sizeof(T);
}
int main()
{
unsigned n = sizeof(unsigned char); // n为1
unsigned n1 = tt<unsigned char>(); // n1为8
unsigned n2 = tt<double>(); // n2也为8
return 0;
}
这样表明返回的类型的大小不对,即VC6.0没能识别出类型T来,但是此段代码在g++ 3.4.5中n1是1的
由于template是编译器实例化的,当编译器实例化每个类型的函数后,将记录最后一个类型,故导致类型判断错误。为验证上述猜测,写了下面的一段测试代码:
template <typename T>
unsigned tt()
{
return sizeof(T);
}
int main()
{
unsigned n = sizeof(unsigned char); // n为1
unsigned n1 = tt<unsigned char>(); // n1为2
unsigned n2 = tt<double>(); // n2为2
unsigned n3 = tt<short>(); // n3为2
return 0;
}
说明上述猜测是正确的,那么我通过在函数参数表中指定T类型呢?
template <typename T>
unsigned tt(T a)
{
return sizeof(T);
}
int main()
{
unsigned n = sizeof(unsigned char); // n为1
unsigned char f1(0);
unsigned n1 = tt<unsigned char>(f1); // n1为1
double f2(0);
unsigned n2 = tt<double>(f2); // n2为8
return 0;
}
ok,问题解决,只不过添加了一个无用的变量a,此乃无奈之举,谁叫老板要用VC6呢
浙公网安备 33010602011771号