public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* c++/3024: class inheritance of template arguments fail
@ 2001-06-01  1:36 jorgen.sigvardsson
  0 siblings, 0 replies; 3+ messages in thread
From: jorgen.sigvardsson @ 2001-06-01  1:36 UTC (permalink / raw)
  To: gcc-gnats

>Number:         3024
>Category:       c++
>Synopsis:       class inheritance of template arguments fail
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          rejects-legal
>Submitter-Id:   net
>Arrival-Date:   Fri Jun 01 01:36:00 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     Jorgen Sigvardsson
>Release:        gcc 2.95.3 through gcc-3.0 snapshot 20010528
>Organization:
>Environment:
Reading specs from /usr/tmp/gcc/lib/gcc-lib/i386-unknown-freebsd4.3/3.0/specs
Configured with: ./configure --prefix=/usr/tmp/gcc
Thread model: single
gcc version 3.0 20010528 (prerelease)
>Description:
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>
{
};

This yields the error message:
xxx.cpp: In instantiation of `Y<X>':
xxx.cpp:LL:  instantiated from here
xxx.cpp:LL: base class `X' has incomplete type

>From a "top down lexically scoped" point of view I 
fully agree with the compiler. 
>How-To-Repeat:
Compile using g++ on the testcase given above.
>Fix:
I don't have a code fix, since I wouldn't understand the 
g++-code even if it jumped up and bit me in the ass. 

But I have some theories of how to make this work; Simply defer
the instantiation of templated base classes if they may not be resolved
on the fly. After the first pass of class X (in this case), then
instantiate Y<X> and apply the changes. (I have only taken a course
in programming languages and compiler construction, so I'm probably
totally out of my league here. ;)
>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: c++/3024: class inheritance of template arguments fail
@ 2001-06-01  4:36 Jörgen Sigvardsson
  0 siblings, 0 replies; 3+ messages in thread
From: Jörgen Sigvardsson @ 2001-06-01  4:36 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 3151 bytes --]

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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: c++/3024: class inheritance of template arguments fail
@ 2001-06-01  3:26 Artem Khodush
  0 siblings, 0 replies; 3+ messages in thread
From: Artem Khodush @ 2001-06-01  3:26 UTC (permalink / raw)
  To: nobody; +Cc: gcc-prs

The following reply was made to PR c++/3024; it has been noted by GNATS.

From: "Artem Khodush" <artem@duma.gov.ru>
To: <jorgen.sigvardsson@kau.se>
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:15:30 +0400

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


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2001-06-01  4:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-06-01  1:36 c++/3024: class inheritance of template arguments fail jorgen.sigvardsson
2001-06-01  3:26 Artem Khodush
2001-06-01  4:36 Jörgen Sigvardsson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).