473,387 Members | 1,528 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

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

Templates and inheritance

Hi,

I have the following problem. Consider two simple classes AA and BB,
BB inherits from AA. AA contains a class A inside and a pure virtual
method getA returning an object of class A. BB overrides both.
Here is the code:

class AA {
public:
class A {
public:
A(void) {};
};
virtual A getA(void) = 0;
virtual ~AA() {};
};

class BB : public AA {
public:
class A : public AA::A {
public:
A(void) {};
};
virtual AA::A getA(void) { return BB::A(); };
virtual ~BB() {};
};

BB b;

int main(void)
{
return 0;
}

So far, so good. Everything goes fine. But now suppose that we
change the classes AA/BB into class *templates*:

template <class T>
class AA {
public:
class A {
public:
A(void) {};
};
virtual A getA(void) = 0;
virtual ~AA() {};
};

template <class T, unsigned N>
class BB : public AA<T{
public:
class A : public AA<T>::A {
public:
A(void) {};
};
virtual AA<T>::A getA(void) { return BB::A(); };
virtual ~BB() {};
};

BB<int,5b;

int main()
{
return 0;
}

Although I didn't do any other changes, I cannot compile it
(with GNU C++ 4.1.0). I receive the following errors:

wzlsd2.cpp:19: error: type 'AA<T>' is not derived from type 'BB<T, N>'
wzlsd2.cpp:19: error: expected ';' before 'getA'
wzlsd2.cpp:23: error: cannot declare variable 'b' to be of abstract type
'BB<int, 5u>'
wzlsd2.cpp:13: note: because the following virtual functions are pure within
'BB<int, 5u>':
wzlsd2.cpp:8: note: AA<T>::A AA<T>::getA() [with T = int]

Obviously the first error is the important one. Compiler does not accept
the type AA<T>::A, althougth it accepted it just few lines above (when
declaring class BB<T,N>::A).

And my question is: what's wrong? What mistake I'm doing here?
Or is this a compiler's bug?

TIA,
Przemek


Mar 30 '07 #1
4 3943
Przemyslaw Koprowski wrote:
Hi,

I have the following problem. Consider two simple classes AA and BB,
BB inherits from AA. AA contains a class A inside and a pure virtual
method getA returning an object of class A. BB overrides both.
Here is the code:

class AA {
public:
class A {
public:
A(void) {};
};
virtual A getA(void) = 0;
virtual ~AA() {};
};

class BB : public AA {
public:
class A : public AA::A {
public:
A(void) {};
};
virtual AA::A getA(void) { return BB::A(); };
virtual ~BB() {};
};

BB b;

int main(void)
{
return 0;
}

So far, so good. Everything goes fine. But now suppose that we
change the classes AA/BB into class *templates*:

template <class T>
class AA {
public:
class A {
public:
A(void) {};
};
virtual A getA(void) = 0;
virtual ~AA() {};
};

template <class T, unsigned N>
class BB : public AA<T{
public:
class A : public AA<T>::A {
public:
A(void) {};
};
virtual AA<T>::A getA(void) { return BB::A(); };
virtual ~BB() {};
};

BB<int,5b;

int main()
{
return 0;
}

Although I didn't do any other changes, I cannot compile it
(with GNU C++ 4.1.0). I receive the following errors:

wzlsd2.cpp:19: error: type 'AA<T>' is not derived from type 'BB<T, N>'
wzlsd2.cpp:19: error: expected ';' before 'getA'
wzlsd2.cpp:23: error: cannot declare variable 'b' to be of abstract type
'BB<int, 5u>'
wzlsd2.cpp:13: note: because the following virtual functions are pure within
'BB<int, 5u>':
wzlsd2.cpp:8: note: AA<T>::A AA<T>::getA() [with T = int]

Obviously the first error is the important one. Compiler does not accept
the type AA<T>::A, althougth it accepted it just few lines above (when
declaring class BB<T,N>::A).
virtual typename AA<T>::A getA().

And remove the BB:: inside getA

virtual typename AA<T>::A getA() { return A(); }
Mar 30 '07 #2
On Mar 30, 12:49 pm, Przemyslaw Koprowski <o...@siggraph.pkoprowski>
wrote:
So far, so good. Everything goes fine. But now suppose that we
change the classes AA/BB into class *templates*:

template <class T>
class AA {
public:
class A {
public:
A(void) {};
};
virtual A getA(void) = 0;
virtual ~AA() {};

};

template <class T, unsigned N>
class BB : public AA<T{
public:
class A : public AA<T>::A {
public:
A(void) {};
};
virtual AA<T>::A getA(void) { return BB::A(); };
virtual ~BB() {};

};

BB<int,5b;

int main()
{
return 0;

}

Although I didn't do any other changes, I cannot compile it
(with GNU C++ 4.1.0). I receive the following errors:

And my question is: what's wrong? What mistake I'm doing here?
Or is this a compiler's bug?
For what it's worth, this compiles and runs on Visual Studio. That
doesn't necessarily mean it's a compiler bug in g++, it could be an
extension or a bug in VS.

Michael

Mar 30 '07 #3
On Fri, 30 Mar 2007 18:52:42 +0000, red floyd wrote:
virtual typename AA<T>::A getA().

And remove the BB:: inside getA

virtual typename AA<T>::A getA() { return A(); }
Thanks. It works, now.

Przemek


Mar 30 '07 #4
Przemyslaw Koprowski wrote:
On Fri, 30 Mar 2007 18:52:42 +0000, red floyd wrote:
>virtual typename AA<T>::A getA().

And remove the BB:: inside getA

virtual typename AA<T>::A getA() { return A(); }
Thanks. It works, now.

Przemek
By the way, I believe g++ complaining about BB:A() is an error in g++.
Comeau likes

virtual typename AA<T>::A getA() { return BB::A(); }
Mar 30 '07 #5

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

Similar topics

1
by: Markus Seeger | last post by:
Hi, I'm writing a commandline argument parser that can handle switches by using some techniques similar to the Qt slot mechanism. example: // inheritance method (what I'm trying at the...
3
by: darkstorm | last post by:
I have a doubt regarding inheritance involving templates Consider this: ///////////////////////////////////// template<typename T> class A { private: T m_a;
16
by: WittyGuy | last post by:
Hi, What is the major difference between function overloading and function templates? Thanks! http://www.gotw.ca/resources/clcm.htm for info about ]
10
by: makc.the.great | last post by:
now that I am looking at templates, there's the question. why same effect couldn't/shouldn't be achieved with inheritance? provided the difference of the two, when and where do I use templates...
11
by: Peter Oliphant | last post by:
Is there any plan to support templates with managed code in the (near) future? For instance, VS.NET 2005... : )
4
by: qning88 | last post by:
I would like to find out how I can effectively make use of templates in theexample below. In Class A, I have 3 overloaded member functions "send" for handling the different messages. Although...
6
by: Ravi Rao | last post by:
Hi, This is about "templates vs inheritance" (please, before you flame me, I do understand that they cover largely non-intersecting domains). Apart from D&E*, I've found either online...
3
by: Paulo Matos | last post by:
Hi all, I'm curious if I can say in C++ that a certain template can only be instantiated (template-wise) by a class implementing a certain interface (inheriting from a given abstract class). ...
5
by: Lars Hillebrand | last post by:
Hello, i discovered a weird behaviour if i use templates together with virtual inheritance and method over. I managed to reproduce my problem with a small example: // *********** <code...
2
by: Isaac Gelado | last post by:
Hi, I am having problems with inheritance in templates classes. Say I have the following classes: class A {}; class B: public A {}; template<typename Tclass C {}; Now in my code I have...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

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.