【发布时间】:2013-02-09 07:39:00
【问题描述】:
(我假设知道这个问题中的Abrahams/Dimov example。)
假设在这样的标头中有一些第 3 方代码,您无法修改:
template<class T> void f(T); // (1) base template 1
template<class T> void f(T *); // (2) base template 2
template<> void f<>(int *); // (3) specialization of (2)
问题是:
如果我已按原样获得上述声明,是否有可能我现在可以针对 T = int *(例如)的情况专门化基本模板 1?
或者仅仅声明基本模板 2 是否意味着基本模板 1 不能再被特化(至少对于指针而言)?
【问题讨论】:
-
即使可以,该专业化是否可以调用?如果使用指针调用 f ,则基本模板 2 似乎总是“获胜”。
-
@Mat:据我所知,不是来自当前的翻译单元,但我认为它可以从另一个翻译单元调用,对吧?假设另一个翻译单元具有#1 和相应特化的非重载声明。
-
一个在范围内没有基本模板 2 的 TU? (不确定我是否理解。)还要注意 ODR 违规行为。
-
@Mat:是的,我就是这个意思。另一个翻译单元可以只声明第一个基本模板及其所有特化,但避免定义特化。当前 TU 中定义的专业化将可以通过这种方式调用。
-
如果函数不在同一个头文件中,你可以尝试
#includeing他们在不同的命名空间
标签: c++ template-specialization function-templates