免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1594 | 回复: 2
打印 上一主题 下一主题

[C++] C++ PRIMER问题之重载函数模板解析。 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-04 10:53 |只看该作者 |倒序浏览
1>;
P430:

template < typename Type>;
Type sum ( Type * , int );

template < typename Type>;
Type sum ( Type , int );

int ia[1024];

int ival1 = sum < int >; ( ia , 1024 );

举此例之前有:(书中原文):“即使对于一个函数调用,两个不同的函数模板都可以实例化,但该函数调用 仍然不是二义的”。然后举了上述例子加以说明。

我认为 sum 函数调用只能用第一个模板产生实例,第二个模板并不是它的“可行函数”,而上述一段话中为什么又讲这两个不同的函数模板都可以实例化呢?


2>;
template < class Type>;
Type sum (Type , int ) { }

template < >; double sum <double>; ( double , int );

void manip ( double ii, double dd )
{
sum ( dd, ii);
}

如果有一个普通函数(没有模板函数)如:double sum (doluble , int );
则 sum ( dd, ii);会被调用,ii 被转化为 int ,上述模板的特化也能同样被调用吗(有或没有普通函数的两种情况下)?如果是调用 " sum <double>; ( dd, ii) // 显示模板实参 " 呢?


3>;
P433:

template <class T>; T min ( T, T);
int min ( int , int ) { }
int ai[4] = { 0 };
int main () {
min (ai[0], 99 ); }
// 这样的调用不是二义的, 因为非模板函数存在时,因为该函数被显示实现,所以它被给予更高的优先级。 (这一句话是书上原文)

P435:

template < class Type>;
Type max ( Type , Type ) { .. . . }
double max (double , double );

int main () {
double dval;
max ( 0.25, dval );
}
//因为调用两个函数都完全匹配,所以该调用存在二义。( 引用书上原文)

问题:为什么一个有二义,一个没有二义?它们是一样的意思啊。
虽然最后调用的都是普通函数,但为什么一个有二义,一个没有呢?

论坛徽章:
0
2 [报告]
发表于 2003-09-04 13:55 |只看该作者

C++ PRIMER问题之重载函数模板解析。

感觉你的问题比较难,我对模板也没什么深的研究,不过我根据你所说的试了一试,得出的一些结论:
1>;书上的是对的

请看template.cpp

  1. #include <iostream>;
  2. #include <cstdlib>;
  3. #include <cstdio>;
  4. #include <memory.h>;

  5. template < typename Type>;
  6. Type sum ( Type * array, int max)
  7. {
  8.         cout<<"here\n";
  9.         Type tmp=0;
  10.         return tmp;
  11. }

  12. template < typename Type>;
  13. Type sum ( Type array, int max)
  14. {
  15.         cout<<"there\n";
  16.         Type tmp=0;
  17.         return tmp;
  18. }

  19. int main()
  20. {
  21.         int ia[1024];
  22.         for(int i=0;i<1024;i++)
  23.         {
  24.                 ia[i]=1;
  25.         }
  26.         cout<<sum < int >; ( ia , 1024 )<<endl;
  27.         cout<<sum < int * >; ( ia ,1024 )<<endl;
  28.         return 0;
  29. }
复制代码

编译后运行,结果为:
here
0
there
0x0

2>;我不太明白你说的意思

3>;感觉没有二义性,即使是没有显示实现的情况下,故我的结论是如果在没有找到任何匹配函数的情况下,才会去匹配模板,模板的优先级别最低。

template.cpp

  1. #include <iostream>;
  2. template < class Type>;
  3. Type max ( Type , Type ) { cout<<"here!"<<endl; }
  4. double max (double , double ) ;

  5. int main () {
  6.         double dval;
  7.         max ( 0.25, dval );
  8. }

复制代码


template_m.cpp

  1. #include <iostream>;
  2. double max (double , double ){ cout<<"there!"<<endl; }
复制代码

编译后运行,结果为:(g++ -o xx template.cpp template_m.cpp)
there!

如果对C++编译原理清楚的话就好了:)

论坛徽章:
0
3 [报告]
发表于 2003-09-04 13:58 |只看该作者

C++ PRIMER问题之重载函数模板解析。

对了,我的环境是CYGWIN,:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP