一个有关名字空间和函数模板的问题

yanwei119 2006-11-09 09:50:11
//min.h//

#ifndef MIN_H
#define MIN_H

namespace my {

template<class T>
T show ( T num1 , T num2 ){
return num1 > num2 ? num1 : num2;
}

}

#endif


//test.cpp//

#include <iostream>
using std::cout;
using std::endl;

#include "min.h"
using my::show; // using namespace my;

int show ( int val1 , int val2 ) {
return val1 < val2 ? val1 : val2;
}

int main()
{
int a = 9;
int b = 1;

cout << show ( a , b ) << endl; // 可这里调用的是模板实例 !我认为这里应该调用
// show( int , int ) 的普通函数 , 当我把
// using my::show; 改为 using namespace my;之后
// 这里调用的就不是模板实例了 ,而是普通函数,
// 这是为什么?

return 0;
}

...全文
229 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
abblly 2006-11-09
  • 打赏
  • 举报
回复
按照C++的规定来说,应该是调用普通函数,不应该调用模板函数的,参见TCPL的13.3.2节
“如果一个函数和一个模板专门化有同样好的匹配,那么就选用函数”
你两种方法调用不同的函数,是因为编译器对C++模板支持的不好,我用的vc6,也是和你一样的效果,也就是不正确的效果。
orangeshing 2006-11-09
  • 打赏
  • 举报
回复
把using my::show放在main函数里面就是调用模板函数了
herman~~ 2006-11-09
  • 打赏
  • 举报
回复
我用 DEV C++试了 ,调用的是普通的函数
nule 2006-11-09
  • 打赏
  • 举报
回复
何以见得是调用的模板实例?我试了下,调用的是show函数。
test.cpp中你对int类型进行了定制,所以不可能调用函数模板。
你可以如下看看:
//min.h
#ifndef MIN_H
#define MIN_H
#include <iostream>
namespace my
{
template<class T>
T show ( T num1 , T num2 )
{
std::cout<<"template"<<std::endl;
return num1 > num2 ? num1 : num2;
}
}
#endif


//test.cpp
#include <iostream>
using std::cout;
using std::endl;

#include "min.h"
//using my::show;
// using namespace my;

int show ( int val1 , int val2 )
{
cout<<"show"<<endl;
return val1 < val2 ? val1 : val2;
}

int main()
{
int a = 9;
int b = 1;
cout << show ( a , b ) << endl;
return 0;
}

我用MinGW调试的结构,输出都是show.
triace_zhang 2006-11-09
  • 打赏
  • 举报
回复
你用的是什么编译器,我用devcpp结果是普通函数......
飞哥 2006-11-09
  • 打赏
  • 举报
回复
本来就是这么调用的嘛

这些都由编译器来完成了·

64,654

社区成员

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

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