注册 登录
编程论坛 C++教室

函数模板支持重载,但vc6是不是有模板重载后非模板函数就不支持类型自动转换?

xufen340 发布于 2009-08-27 13:37, 801 次点击
1.自动转化
#include<iostream>
using std::cout;
using std::endl;
int const& max(int const& a,int const& b)
{
    return a<b?b:a;
}
int main()
{
    cout<<max('a',42)<<endl;
    return 0;
}

2.函数重载后,编译出错,没有调用非模板函数,还是调用模板。
#include<iostream>
using std::cout;
using std::endl;
inline int const& max(int const& a,int const& b)
{
    return a<b?b:a;
}
template<typename T>
inline T const& max(T const& a,T const& b)
{
    return a<b?b:a;
}
int main()
{
    cout<<::max('a',42)<<endl;
    return 0;
}
编译出错,参数不确定。
所以,函数模板支持重载,但重载后vc6不支持非函数模板自动转换了。
1 回复
#2
xufen3402009-08-27 15:05
另外vc6是不是模板重载后不能识别指针参数和非指针参数?
如非模板:
#include<iostream>
inline int* const& max(int* const& a,int* const& b)
{
    return *a<*b?b:a;
}
inline int const& max(int const& a,int const& b)
{
    return a<b?b:a;
}
int main()
{
    int a=7;
    int b=42;
    int* p1=&b;
    int* p2=&a;
    ::max(p1,p2);
    return 0;
}
正确调用inline int* const& max(int* const& a,int* const& b) 。
如模板:
#include<iostream>
template<typename T>
inline T* const& max(T* const& a,T* const& b)
{
    return *a<*b?b:a;
}
template<typename T>
inline T const& max(T const& a,T const& b)
{
    return a<b?b:a;
}
int main()
{
    int a=7;
    int b=42;
    int* p1=&b;
    int* p2=&a;
    ::max(p1,p2);
    return 0;
}
编译错误,max(p1,p2);不清楚调用哪个覆盖。
所以vc6.0模板重载还是不要改变参数指针类型,只能改变参数数量或显示指定参数类型。
以上程序在devc++里都编译正确。
1