On Thu, 09 Feb 2006 12:01:45 -0800, wkaras wrote:[color=blue]
> Victor Bazarov wrote:[color=green]
>>
wkaras@yahoo.com wrote:[color=darkred]
>> > I tried a couple of compilers, and both gave errors compiling this:
>> >
>> > template <bool fin, typename T>
>> > T foo(T val);
>> >
>> > template <typename T>
>> > T foo<true, T>(T val) { return(val); }
>> >
>> > But both gave no errors compiling this:
>> >
>> > template <bool fin, typename T>
>> > struct foo
>> > {
>> > T operator () (T val);
>> > };
>> >
>> > template <typename T>
>> > struct foo<true, T>
>> > {
>> > T operator () (T val) { return(val); }
>> > };
>> >
>> >
>> > Does the Standard truly have different rules for partial specialization
>> > for function templates vs. class templates? If so, why?[/color]
>>
>> Yes, there are no partial specialisations of function templates. Why?
>> Ask in comp.std.c++, they own and discuss the rationale behind the C++
>> Standard. But if I need to make a guess, I'd say, "because it was not
>> necessary". The same result can be achieved by overloading or by just
>> defining another function template.[/color]
> ...
>
> While necessity is always relative, partial specialization of functions
> could
> be useful:
>
> template <unsigned A, unsigned B>
> void bar(void) { return(foo< (A > B) >()); }[/color]
I don't see any partial specialisation here. Did you mean to define some
'foo' template as well?
[color=blue]
> I doesn't occur to me why partial specialization would be considered
> more
> useful or important for classes as opposed to functions. Of course you
> can get around it by defining the equivalent partialy specialized
> classes with member functions with the same name. Just seems
> like a pointless asymmetry between function and class templates,
> though.[/color]
Asymetry is due to the different name resolution rules. For example, you
are not allowed to have two different classes with the same name. You are
allowed, however, to have two functions with the same name, but with
different arguments. Why not extend this *existing* asymetry onto
templates? Seems rather natural.
template<unsigned U1, unsigned U2> unsigned foo() { return U1+U2; }
template<unsigned U> unsigned foo() { return U; }
// the latter is instead of
// template<unsigned U> unsigned foo<U,U>() { return U; }
#include <iostream>
int main() {
std::cout << "foo<1,2>() is " << foo<1,2>() << std::endl;
std::cout << "foo<3>() is " << foo<3>() << std::endl;
}
Victor