问题描述
- c++中显式实例化的问题?
-
先看看一下代码:
#includetemplate
T lesser(T a, T b)
{
return a < b ? a : b;
}int lesser(int a, int b)
{
a = a < 0 ? -a : a;
b = b < 0 ? -b : b;
return a < b ? a : b;
}
int main()
{
using namespace std;
int m = 20;
int n = -30;
double x = 15.5;
double y = 25.9;cout << lesser(m, n) << endl; cout << lesser(x, y) << endl; cout << lesser<>(m, n) << endl; //*** cout << lesser<int>(x, y) << endl; cin.get(); return 0;
}
看看打着星号的那一行。
这一行进行了显式实例化,就是直接告诉编译器我要
template
T lesser(T a, T b)
这个模板的int形式,即是:
int lesser(int a, int b)
那么问题来了:
这个int的显示不是跟上面定义的非模板函数在函数特征上一样了么?
这样不算重定义么?
为什么还能正常运行呢?
求解= =
解决方案
比如说,这样的函数:
class A {};
class B : public A {};
class C : public B {};
void foo(A a) {}
void foo<T>(B b) {}
那么
C c;
foo(c);
请问调用的是哪个?
解决方案二:
C++模版 显式实例化、显式具体化、隐式实例化
c++模版技术:包含模型、显式实例化、分离模型
解决方案三:
你写了一个特例模板,编译器匹配的时候会找最近能匹配的,而且特例的模板优先级高于模板,就是说会先匹配两个带int参数的函数。
解决方案四:
这是编译器的一种实现方式,**_你写了一个特例模板,编译器匹配的时候会找最近能匹配的,而且特例的模板优先级高于模板,就是说会先匹配两个带int参数的函数。_**
不然你想想,微软怎么开发出来高性能的编译器...其实有些问题应该自己多动脑子去想,不要一味的去问,这样往往得不到好的答案,或者答案满足不了你的问题,那么
建议看看Thinking in c++, 里面关于模版说的很清楚!!!