void function returning value?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Jochen Zeischka

    void function returning value?

    I'm puzzled. When compiling this:

    template<class ValRes, class Val1, class Val2>
    Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    Veld<Val2>& v2) {
    // something
    return res;
    }

    the compiler says:

    error C2562: 'mult' : 'void' function returning a value
    c:\fe dev\lin lag 9\veld.h(64) : see declaration of 'mult'

    which is the following line within the 'Veld' class:

    template<class ValRes, class Val1, class Val2>
    friend Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    Veld<Val2>& v2);

    forward declaration of the friend function was done as follows:

    template<class Val> class Veld;

    template<class ValRes, class Val1, class Val2>
    Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    Veld<Val2>& v2);

    Why is the compiler talking about a 'void' function? To me it seems that a
    'Veld<ValRes>&' is returned...

    Thanks a lot for any help!

    Jochen Zeischka


  • tom_usenet

    #2
    Re: void function returning value?

    On Wed, 25 Feb 2004 12:11:17 +0100, "Jochen Zeischka"
    <jochen.zeischk a@rug.ac.be> wrote:
    [color=blue]
    >I'm puzzled. When compiling this:
    >
    >template<cla ss ValRes, class Val1, class Val2>
    >Veld<ValRes> & mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    >Veld<Val2>& v2) {
    > // something
    > return res;
    >}
    >
    >the compiler says:
    >
    >error C2562: 'mult' : 'void' function returning a value
    >c:\fe dev\lin lag 9\veld.h(64) : see declaration of 'mult'
    >
    >which is the following line within the 'Veld' class:
    >
    > template<class ValRes, class Val1, class Val2>
    > friend Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    >Veld<Val2>& v2);
    >
    >forward declaration of the friend function was done as follows:
    >
    >template<cla ss Val> class Veld;
    >
    >template<cla ss ValRes, class Val1, class Val2>
    >Veld<ValRes> & mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    >Veld<Val2>& v2);
    >
    >Why is the compiler talking about a 'void' function? To me it seems that a
    >'Veld<ValRes>& ' is returned...[/color]

    To me too. This compiled fine for me on 3 compilers:

    template<class Val>
    class Veld;

    template<class ValRes, class Val1, class Val2>
    Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    Veld<Val2>& v2);

    template<class Val>
    class Veld
    {
    template<class ValRes, class Val1, class Val2>
    friend Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1,
    const Veld<Val2>& v2);
    //private var to test friendship
    Val v;
    };

    template<class ValRes, class Val1, class Val2>
    Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
    Veld<Val2>& v2)
    {
    res.v = v1.v + v2.v;
    return res;
    }

    int main()
    {
    Veld<double> v1;
    Veld<int> v2;
    Veld<short> v3;
    Veld<double> v = mult(v1, v2, v3);
    }

    What compiler are you using? Can you post a complete program
    exhibiting the error?

    Tom
    --
    C++ FAQ: http://www.parashift.com/c++-faq-lite/
    C FAQ: http://www.eskimo.com/~scs/C-faq/top.html

    Comment

    • Jochen Zeischka

      #3
      Re: void function returning value?

      Strange! When I use your code (which seems perfectly correct to me) I get
      the following message:

      c:\test\templat e mult\main.cpp(2 8) : error C2440: 'initializing' : cannot
      convert from 'void' to 'class Veld<double>'

      line 28 is:

      Veld<double> v = mult(v1, v2, v3);

      So, again, MS VC 6 sees mult as returning void...

      Jochen


      "tom_usenet " <tom_usenet@hot mail.com> wrote in message
      news:lbcp305seu nikm6qfje4faco3 gld0a1ki5@4ax.c om...[color=blue]
      > On Wed, 25 Feb 2004 12:11:17 +0100, "Jochen Zeischka"
      > <jochen.zeischk a@rug.ac.be> wrote:
      >[color=green]
      > >I'm puzzled. When compiling this:
      > >
      > >template<cla ss ValRes, class Val1, class Val2>
      > >Veld<ValRes> & mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
      > >Veld<Val2>& v2) {
      > > // something
      > > return res;
      > >}
      > >
      > >the compiler says:
      > >
      > >error C2562: 'mult' : 'void' function returning a value
      > >c:\fe dev\lin lag 9\veld.h(64) : see declaration of 'mult'
      > >
      > >which is the following line within the 'Veld' class:
      > >
      > > template<class ValRes, class Val1, class Val2>
      > > friend Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
      > >Veld<Val2>& v2);
      > >
      > >forward declaration of the friend function was done as follows:
      > >
      > >template<cla ss Val> class Veld;
      > >
      > >template<cla ss ValRes, class Val1, class Val2>
      > >Veld<ValRes> & mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
      > >Veld<Val2>& v2);
      > >
      > >Why is the compiler talking about a 'void' function? To me it seems that[/color][/color]
      a[color=blue][color=green]
      > >'Veld<ValRes>& ' is returned...[/color]
      >
      > To me too. This compiled fine for me on 3 compilers:
      >
      > template<class Val>
      > class Veld;
      >
      > template<class ValRes, class Val1, class Val2>
      > Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
      > Veld<Val2>& v2);
      >
      > template<class Val>
      > class Veld
      > {
      > template<class ValRes, class Val1, class Val2>
      > friend Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1,
      > const Veld<Val2>& v2);
      > //private var to test friendship
      > Val v;
      > };
      >
      > template<class ValRes, class Val1, class Val2>
      > Veld<ValRes>& mult(Veld<ValRe s>& res, const Veld<Val1>& v1, const
      > Veld<Val2>& v2)
      > {
      > res.v = v1.v + v2.v;
      > return res;
      > }
      >
      > int main()
      > {
      > Veld<double> v1;
      > Veld<int> v2;
      > Veld<short> v3;
      > Veld<double> v = mult(v1, v2, v3);
      > }
      >
      > What compiler are you using? Can you post a complete program
      > exhibiting the error?
      >
      > Tom
      > --
      > C++ FAQ: http://www.parashift.com/c++-faq-lite/
      > C FAQ: http://www.eskimo.com/~scs/C-faq/top.html[/color]


      Comment

      • John Harrison

        #4
        Re: void function returning value?


        "Jochen Zeischka" <jochen.zeischk a@rug.ac.be> wrote in message
        news:c1ibm1$b2b $1@gaudi2.UGent .be...[color=blue]
        > Strange! When I use your code (which seems perfectly correct to me) I get
        > the following message:
        >
        > c:\test\templat e mult\main.cpp(2 8) : error C2440: 'initializing' : cannot
        > convert from 'void' to 'class Veld<double>'
        >
        > line 28 is:
        >
        > Veld<double> v = mult(v1, v2, v3);
        >
        > So, again, MS VC 6 sees mult as returning void...
        >
        > Jochen
        >[/color]

        VC++ 6 has lots of problems with templates. Make sure you have the latest
        service pack (SP5 I think) if that doesn't fix it then try an VC group,
        maybe they'll know a workaround.

        john


        Comment

        Working...