Article View: be.comp.programming
Article #6457Re: ISO C++ does not permit ...
From: Jack D
Date: Tue, 10 Dec 2002 17:37
Date: Tue, 10 Dec 2002 17:37
82 lines
3051 bytes
3051 bytes
Franky Braem wrote on 10-12-2002 15:26:
> Hallo
>
> Ik heb een klasse die erft van een template met zichzelf als 1 van de
> arguments. Deze template heeft een statische member. Ik probeer deze
> statische member te initialiseren via de klasse (en niet via de template)
>
> Wanneer ik compileer met VC, dan werkt alles perfect. Compileer ik met gcc
> (van MingW) dan krijg ik volgende foutmelding:
>
> ISO C++ does not permit 'T<A, B>::var' to be defined as 'A::var'
>
> A erft van T<A,B> en var is een statische member van T. Kan ik gcc deze fout
> laten negeren? Of moet ik een workaround gebruiken?
>
> Waarom gebruik ik niet T<A,B>::var ? Omdat de code gegenereert wordt via een
> macro en die kan (mag) ik niet wijzigen.
>
> Franky.
Een static member variabele van een basisklasse gebruiken in de namespace
van de afgeleide klasse is toegelaten. Het is redelijk gevaarlijk en het is
altijd beter van je data zelf private of protected te houden in de klasse
waarin ze gedefinieerd is.
Gcc op MacOSX compileert de volgende code trouwens zonder problemen:
/////////////////////////////////////////
#include <stdio.h>
template <class X>
class T {
public:
static int var;
};
template <class X> int T<X>::var = 6;
class B : public T<B> {
};
int main() {
printf ("%d\n",B::var);
}
/////////////////////////////////////////
Een mogelijke workaround zou zijn (als je gcc dit toelaat) om een statische
functie in B te definieren die var teruggeeft.
/////////////////////////////////////////
#include <stdio.h>
template <class X>
class T {
public:
static int var;
};
template <class X>
int T<X>::var = 6;
class B : public T<B> {
public:
static int GetVar() {
return T<B>::var;
}
};
int main() {
printf ("%d\n",B::GetVar());
}
/////////////////////////////////////////
Als dat niet gaat, laat gcc dan gewoon de fout negeren.
Greetz,
Jacko
Technical Details
Message-ID:
<BA1BE4EF.174F0%jack_221NOSP@Mhotmail.com>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news2.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-09!supernews.com!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!news.tele.dk!news.tele.dk!small.news.tele.dk!newsfeed.wirehub.nl!news2.euro.net!postnews1.euro.net!news.versatel.net!not-for-mailReferences:
<3df5fa6b$0$20770$ba620e4c@news.skynet.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,c436a161484c41f1 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2002-12-10 09:38:05 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news2.google.com!news1.google.com!sn-xit-02!sn-xit-06!sn-xit-09!supernews.com!news.maxwell.syr.edu!newsfeed.icl.net!newsfeed.fjserv.net!news.tele.dk!news.tele.dk!small.news.tele.dk!newsfeed.wirehub.nl!news2.euro.net!postnews1.euro.net!news.versatel.net!not-for-mail User-Agent: Microsoft-Entourage/10.1.0.2006 Date: Tue, 10 Dec 2002 18:37:35 +0100 Subject: Re: ISO C++ does not permit ... From: Jack D <jack_221NOSP@Mhotmail.com> Newsgroups: be.comp.programming Message-ID: <BA1BE4EF.174F0%jack_221NOSP@Mhotmail.com> References: <3df5fa6b$0$20770$ba620e4c@news.skynet.be> Mime-version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit Lines: 83 Organization: Versatel NNTP-Posting-Date: 10 Dec 2002 17:37:36 GMT NNTP-Posting-Host: 62.58.106.42 X-Trace: 1039541856 news.versatel.net 166 62.58.106.42:50813 X-Complaints-To: abuse@versatel.net