阅读本文时,我对以下示例感到困惑:
// Example 2: Explicit specialization
//
template<class T> // (a) a base template
void f( T );
template<class T> // (b) a second base template, overloads (a)
void f( T* ); // (function templates can't be partially
// specialized; they overload instead)
template<> // (c) explicit specialization of (b)
void f<>(int*);
// ...
int *p;
f( p ); // calls (c)
Run Code Online (Sandbox Code Playgroud)
在这里,(c)是一个明确的专业化(b).
// Example 3: The Dimov/Abrahams Example
//
template<class T> // (a) same old base template as before
void f( T );
template<> // (c) explicit specialization, this time of (a)
void f<>(int*);
template<class T> // (b) a second base template, overloads (a)
void f( T* );
// ...
int *p;
f( p ); // calls (b)! overload resolution ignores
// specializations and operates on the base
// function templates only
Run Code Online (Sandbox Code Playgroud)
这(c)是一个明确的专业化(a).这是为什么?这是因为声明的排序吗?
Jos*_*shD 12
是的,这是因为声明的排序.当编译器在第二组中遇到(c)时,唯一定义的专门化模板是(a).
这就是您在订购模板专业时必须小心的原因.
C++编程语言详细介绍了这一点(第13.5.1节).我强烈推荐它.
Joh*_*itb 10
这是订单,但它不仅仅是订单.对于第一个代码,之前定义了两个模板.但是第二次被采取了.
这是因为比较了两个模板,发现(T)匹配任何匹配的类型(T*),但是(T*)匹配的所有类型都不(T)匹配.因此,第二个模板更加专业化.无论何时放置显式特化并且这两个模板匹配,模板都会进行比较,而更专业的模板则通过显式特化来关联.这种比较称为"部分排序".
标准必须说明以下关于显式专业化声明的相对定位.[部分14.7.3]
所述的显式特声明用于放置功能模板,类模板,类模板的成员函数,类模板的静态数据成员,类模板的成员类,类模板的成员类模板,类模板的成员函数模板,构件的成员函数类模板的模板,非模板类的成员模板的成员函数,类模板的成员类的成员函数模板等,类模板的部分特化声明的放置,非模板类的成员类模板,成员类模板的类模板等,根据显式专业化声明的相对位置及其在翻译单元中的实例化点(如上下文所述),可以影响程序是否格式良好.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.