关于函数模板和非函数模板
#include <iostream>
template <class T>
T max(T x,T y)
{
return ((x> y)?x:y);
}
void main()
{ int a=1;
double b=2;
double c = 3;
double d = 3.3;
double e = 5.0;
std::cout < <max <int> (a,b) < <std::endl;
std::cout < <max <double> (b,c) < <std::endl;
}
上面的程序可以正常运行,但是下面的程序确出现问题:
#include <iostream>
template <class T>
T max(T x,T y)
{
return ((x> y)?x:y);
}
double max(double,double);
//
// double max(double x,double y)
// {
// return ( (x > y) ? x : y);
// }
void main()
{ int a=1;
double b=2;
double c = 3;
double d = 3.3;
double e = 5.0;
std::cout < <max <int> (a,b) < <std::endl;
std::cout < <max <double> (b,c) < <std::endl;
/*
template.obj : error LNK2001: unresolved external symbol "double __cdecl max(double,double) " (?max@@YANNN@Z)
Debug/template.exe : fatal error LNK1120: 1 unresolved externals
*/
std::cout < <max <> (b,c) < <std::endl;
/*
template.obj : error LNK2001: unresolved external symbol "double __cdecl max(double,double) " (?max@@YANNN@Z)
Debug/template.exe : fatal error LNK1120: 1 unresolved externals
*/
}
虽然我声明了 double max(double,double);但是我在写std::cout < <max <double> (b,c) < <std::endl;或者max <> (b,c)时已经明确指出使用模板的,为什么还会调用double __cdecl max(double,double) "呢?
------解决方案--------------------
楼主用啥编译器啊?偶用VC2005,没问题。
[解决办法]
#include <iostream>
template <class T>
T max(T x, T y)
{
return ((x> y)?x:y);
}
double max(double x, double y){
double b = 0;
b = ((x> y)?x:y);
std::cout < < "Hello " < <std::endl;
return b;
}
void main(){
int a=1;
double b=2;
double c = 3;
double d = 3.3;
double e = 5.0;
std::cout < <max <int> (a,b) < <std::endl;
std::cout < <max <double> (b,c) < <std::endl;
std::cout < <max <> (b,c) < <std::endl;
}
VS 2003 运行结果
2
3
3
没有 hello