This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
Re: c++/3024: class inheritance of template arguments fail
- To: nobody at gcc dot gnu dot org
- Subject: Re: c++/3024: class inheritance of template arguments fail
- From: Jörgen Sigvardsson <jorgen dot sigvardsson at kau dot se>
- Date: 1 Jun 2001 11:36:01 -0000
- Cc: gcc-prs at gcc dot gnu dot org,
- Reply-To: Jörgen Sigvardsson <jorgen dot sigvardsson at kau dot se>
The following reply was made to PR c++/3024; it has been noted by GNATS.
From: =?iso-8859-1?q?J=F6rgen=20Sigvardsson?= <jorgen.sigvardsson@kau.se>
To: "Artem Khodush" <artem@duma.gov.ru>
Cc: <gcc-gnats@gcc.gnu.org>, <gcc-bugs@gcc.gnu.org>
Subject: Re: c++/3024: class inheritance of template arguments fail
Date: Fri, 1 Jun 2001 14:39:07 +0200
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Friday 01 June 2001 12:15, Artem Khodush wrote:
> > Classes may not inherit from template argument. I use this with
> > the Microsoft Visual C++ compiler frequently (ATL uses it heavily).
> > I don't know if this is C++ by the book, or if it is a Microsoft
> > extension.
> >
> > The code which fail for me looks like:
> >
> > template <typename T>
> > class Y : public T
> > {
> > // ...
> > };
> >
> > class X : public Y<X>
> > {
> > };
>
> Your code does not compile with Visual C++ 6.0.
> The error message is pretty much the same:
>
> c:\m\t\main.cpp(4) : error C2504: 'X' : base class undefined
>
> This has nothing to do with inheriting from template argument.
> You want to have a class which indirectly inherits from itself,
> this is impossible in C++.
I beg to differ. Check out this page:
http://msdn.microsoft.com/library/devprods/vs6/visualc/vcmfc/_atl_ccomobject.htm
(I'll cite the text here, since the page does not load correctly with
Netscape 4.x - I wonder why? :)
- ----- BEGIN -----
CComObject
template< class Base >
class CComObject : public Base
Parameters
Base
Your class, derived from CComObjectRoot or CComObjectRootEx, as well as from
any other interfaces you want to support on the object.
CComObject implements IUnknown for a nonaggregated object. However, calls to
QueryInterface, AddRef, and Release are delegated to CComObjectRootEx.
- ----- END -----
When you create an ATL COM-object, you inherit from this class like:
class ATL_NO_VTABLE MyClass : public CComObject<MyClass>
{
// ...
};
(ATL_NO_VTABLE is a M$-specific thing - this may perhaps be the thing that
makes this possible? - if you want to investigate, then atlcom.h may be a
good starting point)
At any rate, this is perfectly legal. This kind of stuff is quite neat, since
it allows you to very generic coding. You can make boiler plate code go away
(joy! - In this case, the programmer is relieved of implementing the IUnknown
interface).
If this is a microsoft extension, then g++ should probably not implement it.
But if it is legal C++, then this feature would be very handy indeed. I can
see several KDE/KPart-extensions that would relieve the programmer from a lot
of boiler plate code.
(I'm not subscribed to any gcc-mailinglist, so if you respond to the list,
please make sure to CC me)
- --
Jörgen Sigvardsson, B. Sc.
Lecturer, Computer Science Dept. Karlstad University
Tel: +46-(0)54-700 1786
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (FreeBSD)
Comment: For info see http://www.gnupg.org
iD8DBQE7F4zsJtcD8rikkmwRAjiVAJwKNr8+uFPzxut1JR5rjq4A6KwHAQCfeCf3
evDjxl7Rn5YDv0UmDdfRUnU=
=4DlK
-----END PGP SIGNATURE-----