Boost logo

Boost :

From: Beman Dawes (beman_at_[hidden])
Date: 1999-12-10 20:44:35

At 05:05 PM 12/10/99 -0800, Darin Adler wrote:

>Recently, someone pointed out to me that the swap definition in the
>code is illegal. I thought that I was specializing a swap function
>but in fact this is not possible. As I understand it, there's no
such thing
>as a specialization of a function template. It's possible to
overload a
>function template, but not specialize it.

Darin, I think you have been misinformed. Here is 14.7 [temp.spec]
paragraph 3:

An explicit specialization may be declared for a function template, a
class template, a member of a class template or a member template. An
explicit specialization declaration is introduced by template<>. In
an explicit specialization declaration for a class template, a member
of a class template or a class member template, the name of the class
that is explicitly specialized shall be a template-id. In the
explicit specialization declaration for a function template or a
member function template, the name of the function or
member function explicitly specialized may be a template-id.

 template<class T = int> struct A {
 static int x;
 template<class U> void g(U) { }
 template<> struct A<double> { }; // specialize for T == double
 template<> struct A<> { }; // specialize for T == int
 template<> void g(char) { } // specialize for U == char
 // U is deduced from the parameter type
 template<> void g<int>(int) { } // specialize for U == int
 template<> int A<char>::x = 0; // specialize for T == char
 template<class T = int> struct B {
 static int x;
 template<> int B<>::x = 1; // specialize for T == int
 —end example]

Note two specializations of g(). The standard contains many other
examples of specializations of template functions.

I think the confusion comes because *partial* specialization of
function templates is not permitted.


Boost list run by bdawes at, gregod at, cpdaniel at, john at