 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
M G Berberich Guest
|
Posted: Thu Dec 14, 2006 8:20 pm Post subject: template-Problem mit Ableitung |
|
|
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
|
Posted: Fri Dec 15, 2006 12:05 am Post subject: Re: template-Problem mit Ableitung |
|
|
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
|
Posted: Sat Dec 16, 2006 7:51 pm Post subject: Re: template-Problem mit Ableitung |
|
|
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
|
Posted: Sun Dec 17, 2006 2:58 pm Post subject: Re: template-Problem mit Ableitung |
|
|
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 |
|
 |
|
|
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
|
|