Default arguments in function template specializations

Started by
5 comments, last by greldik 19 years, 1 month ago
Hi Does anyone know if there is a way around this error in VC6?

template< typename T > void Func(T Arg, int Def = 0);
template<> void Func(int Arg, int Def = 0); // C2572
error C2572: 'Func' : redefinition of default parameter : parameter 2 [edit]Realized that the example was stupid, modified it a bit
Advertisement
take out the "=0" on the integer specialization. Sorry, I don't think you can specialize the default parameters, so you have to use your template's base specialization. (could be wrong though)
----Erzengel des Lichtes光の大天使Archangel of LightEverything has a use. You must know that use, and when to properly use the effects.♀≈♂?
So you mean that this error occurs on every compiler? I thought it was VC-specific...

If I remove the default value on the specialization I would have to write code like this to actually call the correct version:
float a; int b;Func(a);// Func(b); <-- This will still call the default versionFunc(b, 0); // <-- This is needed to call specialization

And that's confusing. Of course I could remove the default argument everywhere, but is's nice to have sometimes...=)

Quote:Original post by greldik
So you mean that this error occurs on every compiler? I thought it was VC-specific...


In VS7 I get this:
Quote:f:\Program Files\Microsoft Visual Studio\MYPROJECTS\GLFW Idea Demo 2\Demo.cpp(15): error C2765: 'Func' : an explicit specialization of a function template cannot have any default arguments


In Dev-CPP I get this:
Quote:13 C:\Documents and Settings\Drew Benton\Desktop\main.cpp default argument specified in explicit specialization


So it's just illegal to do [smile]

Quote:And that's confusing. Of course I could remove the default argument everywhere, but is's nice to have sometimes...=)


If you wanted to, you could make a macro [wink]
Second time I've posted this, so here goes...

I think what you're trying to achieve can be solved using overloading (because although you can't partially specialise non-member template functions, you can overload):

template < typename T > void Func(T Arg, int Def);
template < typename T > void Func(T Arg);

Jim.

Edit : just seen you've specialised on int. Can you do the following:

template < typename T > void Func(T Arg, int Def);
template < typename T > void Func(T Arg);
template <> void Func < int > (int Arg);
Quote:Original post by greldik
If I remove the default value on the specialization I would have to write code like this to actually call the correct version:
float a; int b;Func(a);// Func(b); <-- This will still call the default versionFunc(b, 0); // <-- This is needed to call specialization



No you don't, you just can't change the value of default arguments in specializations, unless VC++ 6.0 is also non-standard compliant in this aspect aswell you should be able to call the specialized version and still use default arguments that are declared in the primary template.
Thanks for the replies

Quote:I think what you're trying to achieve can be solved using overloading

Thanks, I will solve it like that. A lot of overloading though, because I've got 3 default arguments in the actual code. =)

Quote:unless VC++ 6.0 is also non-standard compliant in this aspect aswell

Actually, trying to do Func(b) generates this error in VC6:
"error C2660: 'Func' : function does not take 1 parameters"
So it actually tries to call the specialized version but can't, because its second argument is not (cannot be) default.

Templates are a mess! =)

This topic is closed to new replies.

Advertisement