void function returning value?

J

Jochen Zeischka

I'm puzzled. When compiling this:

template<class ValRes, class Val1, class Val2>
Veld<ValRes>& mult(Veld<ValRes>& 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<ValRes>& 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<ValRes>& 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
 
T

tom_usenet

I'm puzzled. When compiling this:

template<class ValRes, class Val1, class Val2>
Veld<ValRes>& mult(Veld<ValRes>& 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<ValRes>& 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<ValRes>& 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...

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<ValRes>& 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<ValRes>& 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<ValRes>& 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
 
J

Jochen Zeischka

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

c:\test\template mult\main.cpp(28) : 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
 
J

John Harrison

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

c:\test\template mult\main.cpp(28) : 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

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top