This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: c++/3024: class inheritance of template arguments fail


-----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-----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]