Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   return type deduction for a function template (http://www.velocityreviews.com/forums/t641330-return-type-deduction-for-a-function-template.html)

C++Liliput 10-24-2008 05:05 AM

return type deduction for a function template
 
Consider the following code

template<class T1, class T2>
T2 sum(T1 a, T1 b)
{
T2 ret = a + b;
return ret;
}

int main()
{
float f1 = 2, f2 = 3;
int i1 = 2, i2 = 4;

sum<float>(f1, f2); //ERROR
float fret = sum<float>(f1, f2); //ERROR
}

Both the statements marked as "ERROR" throw errors during compilation.
Now I can understand the first error in that a return type cannot be
possibly deduced. But what I don't understand is the second error. Why
is the return type not automatically deduced to be float? Such a
deduction happens for arguments of a function template (in case we
don't specify the data type during template instantiation directly).
Then why cannot it happen for the return type? Is it a compiler bug or
was it intended to be the behavior? If so why? I am using g++ compiler
on Linux.

SG 10-24-2008 07:01 AM

Re: return type deduction for a function template
 
On 24 Okt., 07:05, "C++Liliput" <aveekmi...@gmail.com> wrote:
> Consider the following code
>
> template<class T1, class T2>
> T2 sum(T1 a, T1 b)
> {
> * *T2 ret = a + b;
> * *return ret;
>
> }
>
> int main()
> {
> * *float f1 = 2, f2 = 3;
> * *int i1 = 2, i2 = 4;
>
> * *sum<float>(f1, f2); //ERROR
> * *float fret = sum<float>(f1, f2); //ERROR
> *}


There *is* no type deduction for the return type. But you may do the
following:

template<class T2, class T1> // <-- swapped T1 & T2
T2 sum(T1 a, T1 b)
{
T2 ret = a + b;
return ret;
}

int main()
{
float f1 = 2, f2 = 3;

sum<float>(f1, f2); //OK, T2=float, T1=float (deduced)
}

Cheers,
SG

James Kanze 10-24-2008 08:09 AM

Re: return type deduction for a function template
 
On Oct 24, 9:08 am, Hendrik Schober <spamt...@gmx.de> wrote:
> C++Liliput wrote:
> > Consider the following code


> > template<class T1, class T2>
> > T2 sum(T1 a, T1 b)
> > {
> > T2 ret = a + b;
> > return ret;
> > }


> > int main()
> > {
> > float f1 = 2, f2 = 3;
> > int i1 = 2, i2 = 4;


> > sum<float>(f1, f2); //ERROR
> > float fret = sum<float>(f1, f2); //ERROR
> > }


> > Both the statements marked as "ERROR" throw errors during
> > compilation. Now I can understand the first error in that a
> > return type cannot be possibly deduced. But what I don't
> > understand is the second error. Why is the return type not
> > automatically deduced to be float? Such a deduction happens
> > for arguments of a function template (in case we don't
> > specify the data type during template instantiation
> > directly). Then why cannot it happen for the return type?
> > Is it a compiler bug or was it intended to be the behavior?
> > If so why? I am using g++ compiler on Linux.


> I'm afraid the answer is "because the language was designed
> to not to support this". (That it's not impossible to do
> this can be seen in other languages.)


Other languages are other languages. I'm not sure it would work
that well in C++. (Amongst other things, it would offer yet
another possibility for ambiguity in overload resolution. I
hope you're not going to argue that overload resolution is too
simple in C++, and needs to be made more complicated:-).)

It's possible to do in C++, in specific cases where it makes
sense. Just have the class return a proxy object with a

template< typename T > Proxy::operator T() const ;

function.

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


All times are GMT. The time now is 02:26 AM.

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