return type deduction for a function template

Discussion in 'C++' started by C++Liliput, Oct 24, 2008.

  1. C++Liliput

    C++Liliput Guest

    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.
    C++Liliput, Oct 24, 2008
    #1
    1. Advertising

  2. C++Liliput

    SG Guest

    On 24 Okt., 07:05, "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
    >  }


    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
    SG, Oct 24, 2008
    #2
    1. Advertising

  3. C++Liliput

    James Kanze Guest

    On Oct 24, 9:08 am, Hendrik Schober <> 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::eek:perator T() const ;

    function.

    --
    James Kanze (GABI Software) email:
    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
    James Kanze, Oct 24, 2008
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dilip
    Replies:
    3
    Views:
    483
  2. Fei Liu
    Replies:
    0
    Views:
    421
    Fei Liu
    Oct 25, 2007
  3. Fei Liu
    Replies:
    4
    Views:
    772
    Victor Bazarov
    Oct 26, 2007
  4. er
    Replies:
    5
    Views:
    1,270
  5. Replies:
    2
    Views:
    320
Loading...

Share This Page