C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Warum wird das Member statische nicht angelegt?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Georg Maaß
Guest





PostPosted: Sat Nov 29, 2003 7:26 pm    Post subject: Warum wird das Member statische nicht angelegt? Reply with quote



Das Programm (hier verkürzt dargestellt) kompiliert, linkt aber nicht.
Der Linker beschwert sich in main.o über "undefined reference to
`gm::Value::typenames'". Die Größe von typenames (typenamesCount) kann
er jedoch korrekt ausgeben. Aber aus mir unverständlichem Grund, wird
das statische Member nicht angelegt.

Irgendwas scheine ich wohl falsch verstanden zu haben. typenames soll
read-only sein und die in der Klassen-Deklaration aufgezählten
unveränderlichen Elemente beinhalten.



int main(int argc, char **argv)
{
cout << gm::Value::typenames[0] << endl; // <<<<< PROBLEM
return 0;
}


namespace gm
{
class Value
{
public: static const char* const typenames[] =
{
"undefined"
, "string"
, "int"
};
static const unsigned int typenamesCount = (sizeof typenames / sizeof
*typenames);

[... Rest weg gelassen ...]

};
}

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Sat Nov 29, 2003 11:31 pm    Post subject: Re: Warum wird das Member statische nicht angelegt? Reply with quote



Hallo,

Georg Maaß <georg (AT) bioshop (DOT) de> wrote:
Quote:
Das Programm (hier verkürzt dargestellt) kompiliert, linkt aber nicht.
Der Linker beschwert sich in main.o über "undefined reference to
`gm::Value::typenames'".

class Value
{
public: static const char* const typenames[] =
{
"undefined"
, "string"
, "int"
};

Als ich das letzte mal nachgeschaut habe, durfte man in einer
Klassendeklaration nur skalare Konstanten (int/enum) definieren.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Kostka, Volkmar
Guest





PostPosted: Sat Nov 29, 2003 11:59 pm    Post subject: Re: Warum wird das Member statische nicht angelegt? Reply with quote




Hallo,

Georg Maaß wrote:
Quote:
Das Programm (hier verkürzt dargestellt) kompiliert, linkt aber nicht.
Der Linker beschwert sich in main.o über "undefined reference to
`gm::Value::typenames'". Die Größe von typenames (typenamesCount) kann
er jedoch korrekt ausgeben. Aber aus mir unverständlichem Grund, wird
das statische Member nicht angelegt.

Irgendwas scheine ich wohl falsch verstanden zu haben. typenames soll
read-only sein und die in der Klassen-Deklaration aufgezählten
unveränderlichen Elemente beinhalten.

....


Quote:
class Value
{
public: static const char* const typenames[] =
{
"undefined"
, "string"
, "int"
};
static const unsigned int typenamesCount = (sizeof typenames /
sizeof *typenames);

[... Rest weg gelassen ...]

};
}


Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.

In einer H Datei kannst du nur definieren.

MFG

Volkmar Kostka

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Georg Maaß
Guest





PostPosted: Sun Nov 30, 2003 7:55 am    Post subject: Re: Warum wird das Member statische nicht angelegt? Reply with quote

Kostka, Volkmar wrote:
Quote:
Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.

In einer H Datei kannst du nur definieren.

So funktioniert es, ist aber lästig fehleranfällig, weil ich so manuell
berechnen muß, wieviele Einträge das Array hat, während ich es dann an
anderer Stelle befülle. Das ist nicht schön.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Georg Maaß
Guest





PostPosted: Sun Nov 30, 2003 6:35 pm    Post subject: Re: Warum wird das Member statische nicht angelegt? Reply with quote

Kostka, Volkmar wrote:
Quote:
Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.

g++ 2.95.3 meckert weder bei dem static const char * const -Array noch
bei den static const char * const. Für die ersteren erzeugt er keinen
Code, für die zweiten dagegen schon. Integral sind beide nicht. Das
zweite funktioniert, das erste kracht im Linker.


g++ 3.3.2 ist da konsequenter. Bei ihm kompilieren beide nicht und als
Fehler gibt er an, daß nur integrale statische Members bei der
Deklartion auch initialisiert werden dürfen. Das ist auf jeden Fall
besser als das stillschweigend keinen Code erzeugen von g++ 2.95.3.

Die Restriktion des Standards halte ich jedoch für überzogen. Selbst
wenn das Kompilieren durch diese Einschränkung vielleicht ein paar
Sekunden schneller gehen sollte, so verbrauche wesentlich mehr Zeit für
eigentlich überflüssige Schreiberei.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Mon Dec 01, 2003 1:17 pm    Post subject: Re: Warum wird das Member statische nicht angelegt? Reply with quote

Georg Maaß wrote:
Quote:

Kostka, Volkmar wrote:
Du must noch Platz anlegen fuer die Konstanten. Also du must die
Definition in einer CPP Datei wiederholen (also deklarieren), nur ohne
Initialisierungen.

In einer H Datei kannst du nur definieren.

So funktioniert es, ist aber lästig fehleranfällig, weil ich so manuell
berechnen muß, wieviele Einträge das Array hat, während ich es dann an
anderer Stelle befülle. Das ist nicht schön.

Wie dieses?

main.cpp
********

#include <iostream>
#include "test.h"

using namespace std;

int main(int argc, char **argv)
{
cout << gm::Value::typenames[0] << endl; // <<<<< PROBLEM
return 0;
}


test.h
******

namespace gm
{
class Value
{
public:

static const char* const typenames[];
static const unsigned int typenamesCount;
};
}

test.cpp
********

#include "test.h"

const char* const gm::Value::typenames[] =
{
"undefined"
, "string"
, "int"
};

const unsigned int gm::Value::typenamesCount =
(sizeof gm::Value::typenames / sizeof *gm::Value::typenames);


Compiliert und linkt unter VC++ 6.0 einwandfrei. Ich wuesste auch keinen Grund warum
es das nicht tun sollte.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.