读书人

关于函数模板和非函数模板解决思路

发布时间: 2012-04-08 14:38:30 作者: rapoo

关于函数模板和非函数模板
#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

读书人网 >C++

热点推荐