关于函数模板和非函数模板

sophia_sy 2007-02-15 02:46:43
#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)"呢?
...全文
292 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sophia_sy 2007-03-02
  • 打赏
  • 举报
回复
我用vc6编译会产生问题中的错误,但是正如楼上朋友所说,在vc2005中就没有问题了。vc6对模板的支持不是很好,所以本人打算以后使用模板的都不用vc6编译了。呵呵。谢谢各位。
taodm 2007-03-02
  • 打赏
  • 举报
回复
VC6还是早点扔了吧。
sophia_sy 2007-03-02
  • 打赏
  • 举报
回复
我用的是vc6编译器。
bombwang 2007-02-15
  • 打赏
  • 举报
回复
还没看到呢
顶一下
晨星 2007-02-15
  • 打赏
  • 举报
回复
明显是现实中的编译器的问题,嘿嘿。:)
htqx 2007-02-15
  • 打赏
  • 举报
回复
传说中的编译器问题?
Jofee 2007-02-15
  • 打赏
  • 举报
回复
这应该属于模版的特化问题。
double max(double,double);是
template <class T>
T max(T x,T y)
{
return ((x>y)?x:y);
} 的一个特化版本(但是没有实现体)。

当这两个同时存在的时候,
通过max<double>(b,c)来调用,
模版的实现机制会选择double max(double,double)这个函数,
但是你的这个函数又没有实现,所以产生了错误。
tweeg_nee 2007-02-15
  • 打赏
  • 举报
回复
#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
晨星 2007-02-15
  • 打赏
  • 举报
回复
除了要把void main改成int main。
晨星 2007-02-15
  • 打赏
  • 举报
回复
GNU g++ 3.4.4也没问题。
taodm 2007-02-15
  • 打赏
  • 举报
回复
首先,不要搞和std::max重名的东西。
其次,多换几个编译。
最后,不要烂用重载。
晨星 2007-02-15
  • 打赏
  • 举报
回复
楼主用啥编译器啊?偶用VC2005,没问题。
tweeg_nee 2007-02-15
  • 打赏
  • 举报
回复
link 的问题

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧