By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,945 Members | 1,308 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,945 IT Pros & Developers. It's quick & easy.

Templates and inheritance

P: n/a
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
Share this Question
Share on Google+
4 Replies


P: n/a
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

P: n/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

Mar 30 '07 #3

P: n/a
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

P: n/a
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 discussion thread is closed

Replies have been disabled for this discussion.