472,967 Members | 1,786 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,967 software developers and data experts.

Virtual functions in template class issue

I am having a very strange problem involving virtual
functions in template classes. First of all, here is an
extremely simplified structure of the two classes I am
having problems with.

template<class Type> class base
{
public:
base& operator/=(const base&);
Type *image;
// There is more stuff here, but it is not necessary
for this problem
}

class derived : public base<complex<double> >
{
// There is stuff here, but it is not necessary for
this problem
}

template<class Type> base& base<Type>::operator/=(const
base& im)
{
for(int i=0; i<loopLength; i++)
{
if(im.image[i] != 0) {
image[i] = image[i] / im.image[i]; }
else {
image[i] = 0; }
}
return *this;
}

Now as that stands everything works fine, as it should.
The problem comes when I try to make the operator/
function a virtual function in base. I want to derive
another class from base that needs a different
implementation of the operator, but derived can use the
same implementation. So, the only change I made to the
code is:

template<class Type> class base
{
public:
virtual base& operator/=(const base&);
Type *image;
// There is more stuff here, but it is not necessary
for this problem
}

It seems to me that this should all still work, but
instead I get 23 strange errors when I try to compile the
code with the virtual function. I should point out that
base and derived are in separate files and these errors
appear when the source for derived compiles. I don't
understand why I get these errors at all. They all come
from the line of code that contains the if(im.image[i] !=
0). I actually have other operators that get the same
errors. They all come from comparisons in if statements
such as if(im.image[i] != image[i]) and they are all
nearly identical except for the operator they list.

I am completely baffled so please help me. Why does it
work completely fine without the virtual?

Chris

The 23 Errors
-----------------------------------------

Image.cpp(500): error C2784: 'bool std::operator !=(const
_Ty &,const std::complex<_Ty> &)' : could not deduce
template argument for 'const std::complex<_Ty> &'
from 'int'

Image.cpp(500): error C2782: 'bool std::operator !=(const
std::complex<_Ty> &,const _Ty &)' : template
parameter '_Ty' is ambiguous

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::complex<_Ty> &,const std::complex<_Ty> &)' : could
not deduce template argument for 'const std::complex<_Ty>
&' from 'int'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem
*)' : could not deduce template argument for 'const
std::basic_string<_Elem,_Traits,_Ax> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem
*)' : could not deduce template argument for 'const
std::basic_string<_Elem,_Traits,_Ax> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem
*)' : could not deduce template argument for 'const
std::basic_string<_Elem,_Traits,_Ax> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
_Elem *,const std::basic_string<_Elem,_Traits,_Alloc>
&)' : could not deduce template argument for 'const T1 *'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::basic_string<_Elem,_Traits,_Alloc> &,const
std::basic_string<_Elem,_Traits,_Alloc> &)' : could not
deduce template argument for 'const
std::basic_string<_Elem,_Traits,_Ax> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::basic_string<_Elem,_Traits,_Alloc> &,const
std::basic_string<_Elem,_Traits,_Alloc> &)' : could not
deduce template argument for 'const
std::basic_string<_Elem,_Traits,_Ax> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::basic_string<_Elem,_Traits,_Alloc> &,const
std::basic_string<_Elem,_Traits,_Alloc> &)' : could not
deduce template argument for 'const
std::basic_string<_Elem,_Traits,_Ax> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::allocator<_Ty> &,const std::allocator<_Other> &)' :
could not deduce template argument for 'const
std::allocator<_Ty> &' from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::allocator<_Ty> &,const std::allocator<_Other> &)' :
could not deduce template argument for 'const
std::allocator<_Ty> &' from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::allocator<_Ty> &,const std::allocator<_Other> &)' :
could not deduce template argument for 'const
std::allocator<_Ty> &' from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::istreambuf_iterator<_Elem,_Traits> &,const
std::istreambuf_iterator<_Elem,_Traits> &)' : could not
deduce template argument for 'const
std::istreambuf_iterator<_Elem,_Traits> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::istreambuf_iterator<_Elem,_Traits> &,const
std::istreambuf_iterator<_Elem,_Traits> &)' : could not
deduce template argument for 'const
std::istreambuf_iterator<_Elem,_Traits> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::istreambuf_iterator<_Elem,_Traits> &,const
std::istreambuf_iterator<_Elem,_Traits> &)' : could not
deduce template argument for 'const
std::istreambuf_iterator<_Elem,_Traits> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::reverse_iterator<_RanIt> &,const
std::reverse_iterator<_RanIt> &)' : could not deduce
template argument for 'const
std::reverse_iterator<_RanIt> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::reverse_iterator<_RanIt> &,const
std::reverse_iterator<_RanIt> &)' : could not deduce
template argument for 'const
std::reverse_iterator<_RanIt> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::reverse_iterator<_RanIt> &,const
std::reverse_iterator<_RanIt> &)' : could not deduce
template argument for 'const
std::reverse_iterator<_RanIt> &'
from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' :
could not deduce template argument for 'const
std::pair<_Ty1,_Ty2> &' from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' :
could not deduce template argument for 'const
std::pair<_Ty1,_Ty2> &' from 'std::complex<double>'

Image.cpp(500): error C2784: 'bool std::operator !=(const
std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' :
could not deduce template argument for 'const
std::pair<_Ty1,_Ty2> &' from 'std::complex<double>'

Image.cpp(500): error C2676: binary '!
=' : 'std::complex<double>' does not define this operator
or a conversion to a type acceptable to the predefined
operator

Nov 16 '05 #1
3 3886

"Chris" <ch******@ufl.edu> skrev i meddelandet
news:04****************************@phx.gbl...
I am having a very strange problem involving virtual
functions in template classes. First of all, here is an
extremely simplified structure of the two classes I am
having problems with.

template<class Type> class base
{
public:
base& operator/=(const base&);
Type *image;
// There is more stuff here, but it is not necessary
for this problem
}
I guess that in the real code, all the classes are terminated by a
semicolon. :-)

class derived : public base<complex<double> >
{
// There is stuff here, but it is not necessary for
this problem
}

template<class Type> base& base<Type>::operator/=(const
I think the return value should be

base<Type>&
base& im)
{
for(int i=0; i<loopLength; i++)
{
if(im.image[i] != 0) {
And here is your missing operator!=(), since the complex types cannot
be compared to int. Change it to 0.0 and it will compile.
image[i] = image[i] / im.image[i]; }
else {
image[i] = 0; }
}
return *this;
}


Bo Persson
bo**@telia.com

Nov 16 '05 #2
Also addressed in vc.language and vc.stl.

Please don't multipost. If you must post the same message to multiple
groups, you should crosspost.

--
Craig Powers
MVP - Visual C++
Nov 16 '05 #3
"Chris" <ch******@ufl.edu> wrote in message news:<04****************************@phx.gbl>...
I am having a very strange problem involving virtual
functions in template classes. First of all, here is an
extremely simplified structure of the two classes I am
having problems with.

template<class Type> class base
{
public:
base& operator/=(const base&);
Type *image;
// There is more stuff here, but it is not necessary
for this problem
}

class derived : public base<complex<double> >
{
// There is stuff here, but it is not necessary for
this problem
}

template<class Type> base& base<Type>::operator/=(const
base& im)
This needs to be:
template<class Type> base<Type>& base<Type>::operator/=(const
base<Type>& im)
{
for(int i=0; i<loopLength; i++)
{
if(im.image[i] != 0) {
Your use of literal 0 here should be Type(0). As it stands, the
compiler needs to do 2 conversions to turn 0 into a
std::complex<double>. First, 0 (an int) needs to be converted to a
double, then the double needs to be converted to a complex<double>.
The compiler won't do 2 conversions, so you need to help it out with
one.
image[i] = image[i] / im.image[i]; }
else {
image[i] = 0; }
}
return *this;
}

[snip]

It seems to me that this should all still work, but
instead I get 23 strange errors when I try to compile the
code with the virtual function. I should point out that
The 23 errors come from the fact that there are 23 operator!=()s in
scope and it's trying all of them looking for a match.

[snip]
I am completely baffled so please help me. Why does it
work completely fine without the virtual?


virtual is a red-herring here. If you eliminate the derived class and
make operator/= non-virtual, the follow will still produce the 23
errors:

int main() {
base<std::complex<double> > x;
x /= x;
}

"x /= x" is needed to force the instantiation of base<T>::operator/=,
where the real problem is. Using virtual also forces that
instantiation so that the compiler can generate the vtables for base
and derived.

Hope this helps,

John
Nov 16 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Alex Vinokur | last post by:
========================================= Windows 2000 CYGWIN_NT-5.0 1.3.22(0.78/3/2) GNU gcc version 3.2 20020927 (prerelease) ========================================= Here is some program...
6
by: RainBow | last post by:
Greetings!! I introduced the so-called "thin-template" pattern for controlling the code bloat caused due to template usage. However, one of the functions in the template happens to be virtual...
5
by: toton | last post by:
Hi, I want a few of my class to overload from a base class, where the base class contains common functionality. This is to avoid repetition of code, and may be reducing amount of code in binary,...
3
by: YellowMaple | last post by:
Is it possible to have pure virtual functions defined in a template class? I'm trying to do something like this: template <typename T> class Singleton { public: static T& getInstance(void) {...
14
by: v4vijayakumar | last post by:
Why we need "virtual private member functions"? Why it is not an (compile time) error?
14
by: Hunk | last post by:
Hi I ws wondering if there is a way to implement operator+ in case of virtual classes. Here's the problem. I have to have a base string class from which two classes (normal char string and a...
11
by: mathieu | last post by:
Hi there, I don't think I'll be able to describe my issue correctly, so instead I'll just give a pseudo C++ code I am struggling with. Basically I am looking for a 'pure virtual template'...
2
by: cmonthenet | last post by:
Hello, I searched for an answer to my question and found similar posts, but none that quite addressed the issue I am trying to resolve. Essentially, it seems like I need something like a virtual...
10
by: =?Utf-8?B?Y2FybG0=?= | last post by:
Hello, I searched for an answer to my question and found similar posts, but none that quite addressed the issue I am trying to resolve. Essentially, it seems like I need something like a virtual...
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 4 Oct 2023 starting at 18:00 UK time (6PM UTC+1) and finishing at about 19:15 (7.15PM) The start time is equivalent to 19:00 (7PM) in Central...
0
by: Aliciasmith | last post by:
In an age dominated by smartphones, having a mobile app for your business is no longer an option; it's a necessity. Whether you're a startup or an established enterprise, finding the right mobile app...
0
tracyyun
by: tracyyun | last post by:
Hello everyone, I have a question and would like some advice on network connectivity. I have one computer connected to my router via WiFi, but I have two other computers that I want to be able to...
2
by: giovanniandrean | last post by:
The energy model is structured as follows and uses excel sheets to give input data: 1-Utility.py contains all the functions needed to calculate the variables and other minor things (mentions...
4
NeoPa
by: NeoPa | last post by:
Hello everyone. I find myself stuck trying to find the VBA way to get Access to create a PDF of the currently-selected (and open) object (Form or Report). I know it can be done by selecting :...
3
NeoPa
by: NeoPa | last post by:
Introduction For this article I'll be using a very simple database which has Form (clsForm) & Report (clsReport) classes that simply handle making the calling Form invisible until the Form, or all...
3
by: nia12 | last post by:
Hi there, I am very new to Access so apologies if any of this is obvious/not clear. I am creating a data collection tool for health care employees to complete. It consists of a number of...
0
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.