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 

template-Problem mit Ableitung

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





PostPosted: Thu Dec 14, 2006 8:20 pm    Post subject: template-Problem mit Ableitung Reply with quote



Hallo,

ich habe folgenden Code:

void bla(void*) {}

struct A { int *data; };

template<typename X>
class test : public X
{
public:
test()
{
X::data = 0; // ist O.K.
bla(&this->data); // ist auch O.K.
bla(&X::data); // ist nicht O.K.
}
};

test<A> B;

int main() { }

Ohne die »X::«, bzw. »this->« compiliert es mit g++ 4 nicht mehr. Ich
bin mir zwar nicht ganz klar aufgrund welcher Vorgaben im Standard ich
das brauche, aber sei's drum.

Was ich nicht verstehe ist, wieso ich im Funktionsaufruf »X::« nicht
verwenden kann, obwohl es in der Zuweisung ganz wunderbar
funktioniert.

Fehlermeldung ist:

X.cc: In constructor `test<X>::test() [with X = A]':
X.cc:17: instantiated from here
X.cc:13: error: invalid conversion from `int*A::*' to `void*'

MfG
bmg

--
Artikel 3 und 12a des Grundgesetzes kurz | M G Berberich
zusammengefaßt: Männer und Frauen sind | berberic (AT) fmi (DOT) uni-passau.de
gleichberechtigt, ausgenommen Männer, die |
müssen zur Bundeswehr. | http://www.uni-passau.de/~berberic
Back to top
Thomas Maeder
Guest





PostPosted: Fri Dec 15, 2006 12:05 am    Post subject: Re: template-Problem mit Ableitung Reply with quote



M G Berberich <berberic (AT) forwiss (DOT) uni-passau.de> writes:

Quote:
void bla(void*) {}

struct A { int *data; };

template<typename X
class test : public X
{
public:
test()
{
X::data = 0; // ist O.K.
bla(&this->data); // ist auch O.K.
bla(&X::data); // ist nicht O.K.

Der Ausdruck &X::data liefert einen Memberzeiger. Es gibt keine
Konversion von Memberzeiger auf Nichtmemberzeiger, weil die beiden
Dinge völlig unterschiedlich sind.

Einen Memberzeiger verwendet man z.B. folgendermassen:

int *X::*memberzeiger(&X::data); // Variablendefinition
this->*memberzeiger = 5; // Dereferenzierung

Die zweite Zeile ist hier gleichbedeutend mit

this->data = 5;

, weil memberzeiger auf das Member data zeigt.

Quote:
}
};

test<A> B;

int main() { }

Ohne die »X::«, bzw. »this->« compiliert es mit g++ 4 nicht
mehr. Ich bin mir zwar nicht ganz klar aufgrund welcher Vorgaben im
Standard ich das brauche, aber sei's drum.

Der Grund ist, dass der Compiler in der ersten Zeile des
Konstruktorkörpers nicht wüsste, was Du mit dem Namen data bennenst,
wenn Du

data = 0;

schreiben würdest. data ist ein "nicht-abhängiger" Name, denn es
deutet nichts darauf hin, dass vom Template-Paramter X abhängt, was er
benennt. Er wird deshalb bereits aufgelöst, wenn das Template test vom
Compiler angetroffen wird; zu diesem Zeitpunkt ist nicht bekannt, dass
es mit A instantiiert werden wird.

Sobald Du this->data oder X::data schriebst, wird der Name data
abhängig; mit seiner Auflösung wird deshalb zugewartet, bis das
Template instantiiert wird, und es wird dann auch in der Basisklasse X
nach seiner Deklaration gesucht.

Am besten schreibst Du grundsätzlich this->data, um in Templates auf
Members von Basisklassen zuzugreifen, die abhängig von
Templateparametern sind.


Quote:
Was ich nicht verstehe ist, wieso ich im Funktionsaufruf »X::« nicht
verwenden kann, obwohl es in der Zuweisung ganz wunderbar
funktioniert.

Fehlermeldung ist:

X.cc: In constructor `test<X>::test() [with X = A]':
X.cc:17: instantiated from here
X.cc:13: error: invalid conversion from `int*A::*' to `void*'

Siehe oben.
Back to top
Jens Müller
Guest





PostPosted: Sat Dec 16, 2006 7:51 pm    Post subject: Re: template-Problem mit Ableitung Reply with quote



M G Berberich schrieb:
Quote:
Hallo,

ich habe folgenden Code:

void bla(void*) {}

struct A { int *data; };

template<typename X
class test : public X
{
public:
test()
{
X::data = 0; // ist O.K.
bla(&this->data); // ist auch O.K.

Erst dereferenzieren und dann die Adresse holen? Was soll das bringen?
Back to top
Thomas Maeder
Guest





PostPosted: Sun Dec 17, 2006 2:58 pm    Post subject: Re: template-Problem mit Ableitung Reply with quote

Jens Müller <usenet-01-2006 (AT) tessarakt (DOT) de> writes:

Quote:
void bla(void*) {}

struct A { int *data; };

template<typename X
class test : public X
{
public:
test()
{
X::data = 0; // ist O.K.
bla(&this->data); // ist auch O.K.

Erst dereferenzieren und dann die Adresse holen?

Diese Bemerkung wäre zutreffend für den Ausdruck

&*this

.. Da steht aber

&this->data

.. Es wird nicht zuvor dereferenzierte Adresse wiederhergestellt,
sondern diejenige eines Members.


Innerhalb von Templates hat die Schreibweise this-> für den Zugriff
auf Members den Effekt, dass der Membername abhängig wird; die
Auflösung des Namens geschieht deshalb erst dann, wenn das Template
instantiiert, und es wird in anderen Gültigkeitsbereichen gesucht, als
wenn der Name nicht abhängig wäre.
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.