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 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(); }
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
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
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(); } This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
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...
|
by: darkstorm |
last post by:
I have a doubt regarding inheritance involving templates
Consider this:
/////////////////////////////////////
template<typename T>
class A
{
private:
T m_a;
|
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 ]
|
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...
|
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... : )
|
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...
|
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...
|
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).
...
|
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...
|
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...
|
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,...
|
by: Charles Arthur |
last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
|
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$) {
}
...
|
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
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
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...
|
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...
|
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,...
|
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...
| |