金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  423 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
一个函数模板即有特化版又有重载版,编译器会选哪个?

以下代码来自:为什么不要特化函数模版 的例3

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 template<class T>
 6 void f(T)
 7 {
 8     cout << "Base template.\n";
 9 }
10 
11 template<>
12 void f(int*)
13 {
14     cout << "Explicit specialization.\n";
15 }
16 
17 template<class T>
18 void f(T*)
19 {
20     cout << "Overload of base template.\n";
21 }
22 
23 int main()
24 {
25     int * p;
26     f(p);
27 
28     return 0;
29 }
30 

代码中的f(int*)调用有两个选择,一是特化版,另一个是重载版。
结果是编译器选了重载版:Overload of base template.

(与我的期望相反,我并不想让指针版为int*实例化,所以辛辛苦苦为int*作了特化,结果编译器没理我!)

原因是:编译器是从所有的重载函数中选择,而特化不是一个重载。
这时仅有两个重载。当选中一个重载函数模板后,再在该模板的特化版本中选择。
posted on 2008-06-11 11:03 金庆 阅读(1327) 评论(4)  编辑 收藏 引用 所属分类: 1. C/C++

评论

# re: 选特化还是重载 2008-06-11 21:19 尘埃
颠倒 f(int*) 与 f(T*) 再试试看;)  回复  更多评论
  

# re: 选特化还是重载 2008-06-12 10:06 斯卡
#include <iostream>
using namespace std;
template<class T>
void f(T)
{
cout << "Base template.\n";
}
template<class T>
void f(T*)
{
cout << "Overload of base template.\n";
}
template<>
void f(int*)
{
cout << "Explicit specialization.\n";
}

void main()
{
int * p;
f(p);
}

  回复  更多评论
  

# re: 选特化还是重载 2008-06-12 11:36 金庆
将f(int*)特化定义到f(T*)模板之后,结果就不同了,f(p)调用的变成了f(*int)!
"尘埃"和"斯卡"两位很有研究精神,让大家有这个机会深入剖析与思考。
结果变了,结论还是一样的,此时特化针对的主模板变成了f(T*)。  回复  更多评论
  

# re: 选特化还是重载 2008-06-14 15:50 zambiafrog@gmail.com
参考Exceptional C++ Style 第七章 ,比较详细  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理