显式专业化语法

时间:2012-11-23 20:14:16

标签: c++

是吗

template <typename T>
void foo(T) {}

template <>
void foo(int) {}

显式特化或函数重载,并为显式初始化编译器想要看下面的代码?

template <typename T>
void foo(T) {}

template <>
void foo<int>(int) {}

我认为该标准接受以下两种方式:

ISO / IEC 14882:2011

14.7.3 Explicit specialization [temp.expl.spec]

1 ...

can be declared by a declaration introduced by template<>; that is:
explicit-specialization:
template < > declaration

1 个答案:

答案 0 :(得分:2)

要么被允许。在专业化

template <>
void foo(int) {}

编译器从函数参数中推断出模板参数T = int。从14.7.3p10开始:

  

template-argument 可以在 template-id 中指定一个尾随的 template-argument ,命名一个显式的函数模板专门化,只要它可以从函数参数类型中推导出来。

给出的示例涉及从类模板中扣除,但它同样适用于从直接使用的类型中扣除:

template<class T> class Array { /∗ ... ∗/ };
template<class T> void sort(Array<T>& v);
// explicit specialization for sort(Array<int>&)
// with deduced template-argument of type int
template<> void sort(Array<int>&);