Joh*_*n K 4 c++ templates overloading
我有一个正常工作的重载函数.(例子中的f).当我将它转换为同一个东西的模板版本时,它总是通过调用T&版本来打破,而不是T*.(在示例中为t)当我创建模板函数的非const版本时,它按预期工作.(示例中为t2)VS2010和g ++ 4.6.2都会出现这种情况.促销对const规则是否不同,或者这是某种类型的错误.
#include <iostream>
using namespace std;
int f(const int&x){return 1;}
int f(const int*x){return 2;}
template <class T> int t(const T &x){return 3;}
template <class T> int t(const T *x){return 4;}
template <class T> int t2(T &x){return 5;}
template <class T> int t2(T *x){return 6;}
int main(int argc, char ** argv){
int x=0;
cout<<f(x)<<endl;
cout<<f(&x)<<endl;
cout<<t(x)<<endl;
cout<<t(&x)<<endl;
cout<<t2(x)<<endl;
cout<<t2(&x)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
1
2
3
3
5
6
Run Code Online (Sandbox Code Playgroud)
你int x的不是const.因此&x产生了一个int*.以下是两个候选函数:
int t<int*>(T const&)(等效地int t<int*>(int * const&))< - T是int*; 需要0次转换int t<int>(T const*) (等效地int t<int>(int const*))< - T是int; 需要转换int*为int const*选择更好的匹配,即没有转换的匹配.这是参考版本.
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |