博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

VC6.0中Template的问题

Posted on 2009-08-20 13:31  红波  阅读(588)  评论(0)    收藏  举报

因在模板函数中使用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呢