Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   function templates doesn't support default template parameters? (http://www.velocityreviews.com/forums/t617911-function-templates-doesnt-support-default-template-parameters.html)

William Xu 06-01-2008 02:29 PM

function templates doesn't support default template parameters?
 
Compiling:

template <class T = int>
T foo(const T& t)
{}

int main(int argc, char *argv[])
{}

gcc complains:

,----
| /Users/william/repo/helloworlds/foo.cpp:2: error: default template
| arguments may not be used in function templates
`----

But I find in "TC++PL(3rd, special edition)" P.340, Bjarne is giving
function templates with default template parameters as examples.

If current standard doesn't support it, what is the reason here?

--
William

Erik Wikström 06-01-2008 02:46 PM

Re: function templates doesn't support default template parameters?
 
On 2008-06-01 16:29, William Xu wrote:
> Compiling:
>
> template <class T = int>
> T foo(const T& t)
> {}
>
> int main(int argc, char *argv[])
> {}
>
> gcc complains:
>
> ,----
> | /Users/william/repo/helloworlds/foo.cpp:2: error: default template
> | arguments may not be used in function templates
> `----
>
> But I find in "TC++PL(3rd, special edition)" P.340, Bjarne is giving
> function templates with default template parameters as examples.
>
> If current standard doesn't support it, what is the reason here?


It is not supported in the current standard (14.1 §9), I do not know why.

--
Erik Wikström

Kai-Uwe Bux 06-01-2008 03:01 PM

Re: function templates doesn't support default template parameters?
 
Erik Wikstrm wrote:

> On 2008-06-01 16:29, William Xu wrote:
>> Compiling:
>>
>> template <class T = int>
>> T foo(const T& t)
>> {}
>>
>> int main(int argc, char *argv[])
>> {}
>>
>> gcc complains:
>>
>> ,----
>> | /Users/william/repo/helloworlds/foo.cpp:2: error: default template
>> | arguments may not be used in function templates
>> `----
>>
>> But I find in "TC++PL(3rd, special edition)" P.340, Bjarne is giving
>> function templates with default template parameters as examples.
>>
>> If current standard doesn't support it, what is the reason here?

>
> It is not supported in the current standard (14.1 9), I do not know why.


I wonder what difference one should expect from

template < typename T = int >
T foo ( T const & arg );

and

template < typename T >
T foo ( T const & arg );

How would you use the default type? The type T would be deduced from the
argument anyway, wouldn't it?


Best

Kai-Uwe Bux

William Xu 06-01-2008 03:23 PM

Re: function templates doesn't support default template parameters?
 
Kai-Uwe Bux <jkherciueh@gmx.net> writes:

> How would you use the default type? The type T would be deduced from the
> argument anyway, wouldn't it?


Consider the following example then. What if I want the default
comparision method to be Case_insensitive?

#include <iostream>

struct Case_insensitive
{
static bool eq(char c1, char c2) { return tolower(c1) == tolower(c2); }
};

struct Case_sensitive
{
static bool eq(char c1, char c2) { return c1 == c2; }
};

template <class Cmp>
bool eq(char c1, char c2)
{
return Cmp::eq(c1, c2);
}

int main(int argc, char *argv[])
{
char c1 = 'h', c2 = 'H';

/* These are okay. */
eq<Case_insensitive>(c1, c2) ;
eq<Case_sensitive>(c1, c2);

/* But how about this one ? */
/* eq(c1, c2); */

}

--
William

http://williamxu.net9.org

You know what they say -- the sweetest word in the English language is revenge.
-- Peter Beard

Kai-Uwe Bux 06-01-2008 04:00 PM

Re: function templates doesn't support default template parameters?
 
William Xu wrote:

> Kai-Uwe Bux <jkherciueh@gmx.net> writes:
>
>> How would you use the default type? The type T would be deduced from the
>> argument anyway, wouldn't it?

>
> Consider the following example then. What if I want the default
> comparision method to be Case_insensitive?
>
> #include <iostream>
>
> struct Case_insensitive
> {
> static bool eq(char c1, char c2) { return tolower(c1) == tolower(c2); }
> };
>
> struct Case_sensitive
> {
> static bool eq(char c1, char c2) { return c1 == c2; }
> };
>
> template <class Cmp>
> bool eq(char c1, char c2)
> {
> return Cmp::eq(c1, c2);
> }
>
> int main(int argc, char *argv[])
> {
> char c1 = 'h', c2 = 'H';
>
> /* These are okay. */
> eq<Case_insensitive>(c1, c2) ;
> eq<Case_sensitive>(c1, c2);
>
> /* But how about this one ? */
> /* eq(c1, c2); */
>
> }


Now, I can see your point.

On the other hand, it looks as though you want a default argument not a
default type:

#include <cctype>

bool case_insensitive ( char c1, char c2 ) {
return ( std::tolower(c1) == std::tolower(c2) );
}

bool case_sensitive ( char c1, char c2 ) {
return ( c1 == c2 );
}

typedef bool(* char_compare )(char,char);

bool eq ( char c1, char c2, char_compare comp = &case_sensitive ) {
return ( comp( c1, c2 ) );
}

int main ( void ) {
eq( 'c', 'h' );
}


Then again, I am not at all sure whether it is a good idea to have a default
in this case. I generally do not like magic hiding somewhere. Sooner or
later it is going to bite you. From that point of view, I prefer the
verbose version

eq< case_sensitive >( c1, c2 );

to

eq( c1, c2 );



Best

Kai-Uwe Bux

James Kanze 06-01-2008 08:39 PM

Re: function templates doesn't support default template parameters?
 
On Jun 1, 4:46 pm, Erik Wikstrm <Erik-wikst...@telia.com> wrote:
> On 2008-06-01 16:29, William Xu wrote:
> > Compiling:


> > template <class T = int>
> > T foo(const T& t)
> > {}


> > int main(int argc, char *argv[])
> > {}


> > gcc complains:


> > But I find in "TC++PL(3rd, special edition)" P.340, Bjarne
> > is giving function templates with default template
> > parameters as examples.


That surprises me a bit (but someone walked off with my copy of
the 3rd edition, so I can't verify it).

> > If current standard doesn't support it, what is the reason
> > here?


> It is not supported in the current standard (14.1 9), I do
> not know why.


Probably because originally, function template arguments could
only be deduced, not explicitly specified, and a defauld
argument doesn't make sense in that case. For that matter,
given the original poster's example, when would the default
argument be used?

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique oriente objet/
Beratung in objektorientierter Datenverarbeitung
9 place Smard, 78210 St.-Cyr-l'cole, France, +33 (0)1 30 23 00 34

Eric Pruneau 06-02-2008 01:43 AM

Re: function templates doesn't support default template parameters?
 

"James Kanze" <james.kanze@gmail.com> a crit dans le message de news:
ffdcd885-47d4-4b5f-86e1-e9496608bb89...oglegroups.com...
On Jun 1, 4:46 pm, Erik Wikstrm <Erik-wikst...@telia.com> wrote:
> On 2008-06-01 16:29, William Xu wrote:
> > Compiling:


> > template <class T = int>
> > T foo(const T& t)
> > {}


> > int main(int argc, char *argv[])
> > {}


> > gcc complains:


> > But I find in "TC++PL(3rd, special edition)" P.340, Bjarne
> > is giving function templates with default template
> > parameters as examples.


That surprises me a bit (but someone walked off with my copy of
the 3rd edition, so I can't verify it).

> > If current standard doesn't support it, what is the reason
> > here?


> It is not supported in the current standard (14.1 9), I do
> not know why.


Probably because originally, function template arguments could
only be deduced, not explicitly specified, and a defauld
argument doesn't make sense in that case. For that matter,
given the original poster's example, when would the default
argument be used?

--

From C++ Templates (Vandevoorde, Josuttis)

"When templates were originally added to the C++ language, explicit function
template arguments were not a valid construct. [...] Since then, however, it
is possible to specify explicitle function template arguments that cannot be
deduced. "

So the following should compile...

template <typename T1, typename T2 = int>
T2 count (T1 const& x);

Cause T2 cannot be deduced since it is the return parameter. However I tried
with intel c++ 9.1 and VS 2003 compilers and they give me an error...


--------
Eric Pruneau



Erik Wikström 06-02-2008 04:36 PM

Re: function templates doesn't support default template parameters?
 
On 2008-06-02 03:43, Eric Pruneau wrote:
> "James Kanze" <james.kanze@gmail.com> a 閏rit dans le message de news:
> ffdcd885-47d4-4b5f-86e1-e9496608bb89...oglegroups.com...
> On Jun 1, 4:46 pm, Erik Wikstr鰉 <Erik-wikst...@telia.com> wrote:
>> On 2008-06-01 16:29, William Xu wrote:
>> > Compiling:

>
>> > template <class T = int>
>> > T foo(const T& t)
>> > {}

>
>> > int main(int argc, char *argv[])
>> > {}

>
>> > gcc complains:

>
>> > But I find in "TC++PL(3rd, special edition)" P.340, Bjarne
>> > is giving function templates with default template
>> > parameters as examples.

>
> That surprises me a bit (but someone walked off with my copy of
> the 3rd edition, so I can't verify it).
>
>> > If current standard doesn't support it, what is the reason
>> > here?

>
>> It is not supported in the current standard (14.1 � I do
>> not know why.

>
> Probably because originally, function template arguments could
> only be deduced, not explicitly specified, and a defauld
> argument doesn't make sense in that case. For that matter,
> given the original poster's example, when would the default
> argument be used?
>
> --
>
> From C++ Templates (Vandevoorde, Josuttis)
>
> "When templates were originally added to the C++ language, explicit function
> template arguments were not a valid construct. [...] Since then, however, it
> is possible to specify explicitle function template arguments that cannot be
> deduced. "
>
> So the following should compile...
>
> template <typename T1, typename T2 = int>
> T2 count (T1 const& x);
>
> Cause T2 cannot be deduced since it is the return parameter. However I tried
> with intel c++ 9.1 and VS 2003 compilers and they give me an error...


From the standard, 14.1 §9:

A default template-argument is a template-argument (14.3) specified
after = in a template-parameter. A default template-argument may be
specified for any kind of template-parameter (type, non-type, template).
A default template-argument may be specified in a class template
declaration or a class template definition. A default template-argument
shall not be specified in a function template declaration or a function
template definition, nor in the template-parameter-list of the
definition of a member of a class template. A default template-argument
shall not be specified in a friend template declaration.

--
Erik Wikström

Triple-DES 06-03-2008 05:52 AM

Re: function templates doesn't support default template parameters?
 

On 2 Jun, 03:43, "Eric Pruneau" <eric.prun...@cgocable.ca> wrote:
> From C++ Templates (Vandevoorde, Josuttis)
>
> "When templates were originally added to the C++ language, explicit function
> template arguments were not a valid construct. [...] Since then, however, it
> is possible to specify explicitle function template arguments that cannot be
> deduced. "


You actually snipped an important sentence here:
"As a result, there seemed to be no compelling reason to allow default
function template arguments because the default would always be
overriden by the deduced value."

>
> So the following should compile...
>
> template <typename T1, typename T2 = int>
> T2 count (T1 const& x);
>
> Cause T2 cannot be deduced since it is the return parameter. However I tried
> with intel c++ 9.1 and VS 2003 compilers and they give me an error...


The sentence I quoted above should make it clear that the examples in
the book illustrate how default template arguments would be used if
they were allowed, and are not well-formed c++.

DP


All times are GMT. The time now is 11:31 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.