 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Boris Glawe Guest
|
Posted: Fri Sep 29, 2006 6:04 pm Post subject: Typ von Klassen in Klassentemplates |
|
|
Hallo,
unten habe ich ich eine Klassentemplate Master.
In diesem Template ist eine Klasse Nested definiert. Damit diese Klasse
etwas zu tun hat, speichert sie eine Integer Instanzvariable mit dem
Wert 42.
Master speichert eine Instanzvariable vom Typ Nested und vom Typ T.
Letztere ist nur dazu da, um den Datentyp T überhaupt zu benutzen.
Ärger macht die Methode getNested() in Master. Ich weiß nicht, wie der
Datentyp der Nested Klasse aussieht. Mein Vorschlag unten wird vom
Compiler nicht akzeptiert. Ich möchte also eine Referenz auf die
Instanzvariable nested zurückliefern. Wie sieht deren Typ aus? Mein
Compiler beschwert sich bei folgendem Code mit folgender Meldung:
g++ -o test test.cpp -Wall -O3
test.cpp:53: Fehler: expected constructor, destructor, or type
conversion before »&« token
test.cpp: In constructor »Master<T>::Master(T&) [with T = char]«:
test.cpp:78: instantiated from here
test.cpp:41: Fehler: Abhängigenname »Master<T>::Nested« wird als
Nicht-Typ erkannt, aber die Instanziierung liefert einen Typ
test.cpp:41: Anmerkung: »typename Master<T>::Nested« sagen, wenn ein Typ
gemeint ist
Zusätzlich gefällt ihm irgend etwas am Konstruktor von Master<T>::Master
nicht. Kann aber diese Geheimsprache nicht deuten :-)
Grüße Boris
Hier der Code:
----------------------------------------------------------
#include <iostream>
#include <map>
using namespace std;
template <typename T>
class Master
{
public:
class Nested
{
public:
Nested();
int getValue() const;
private:
int value;
};
Master(T&);
Nested& getNested() const;
private:
Nested nested;
T dummyValue;
};
/*
Das Aufrufen des Konstruktors "Master<T>::Nested()"
schlaegt fehl. Wie lautet der korrekt Name des Konstruktors?
*/
template <typename T>
Master<T>::Master(T& dv) :
nested( Master<T>::Nested() ),
dummyValue(dv)
{}
/*
Hier mault der Kompiler, weil er mit dem Typ
"Master<T>::Nested &" nichts anfangen kann.
Wenn ich mich nicht taeuschen, dann ist das aber
der Typ der Instanzvariablen "nested"!?
*/
template <typename T>
Master<T>::Nested & getNested const
{
return nested;
}
template <typename T>
Master<T>::Nested::Nested() :
value(42)
{}
template <typename T>
int Master<T>::Nested::getValue() const
{
return value;
}
int main(){
char c = 'g';
Master<char> m(c);
} |
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Fri Sep 29, 2006 9:37 pm Post subject: Re: Typ von Klassen in Klassentemplates |
|
|
Boris Glawe <boris@boris-glawe.de> writes:
| Quote: | g++ -o test test.cpp -Wall -O3
test.cpp:53: Fehler: expected constructor, destructor, or type
conversion before »&« token
test.cpp: In constructor »Master<T>::Master(T&) [with T = char]«:
test.cpp:78: instantiated from here
test.cpp:41: Fehler: Abhängigenname »Master<T>::Nested« wird als
Nicht-Typ erkannt, aber die Instanziierung liefert einen Typ
test.cpp:41: Anmerkung: »typename Master<T>::Nested« sagen, wenn ein
Typ gemeint ist
|
Welche Version verwendest Du? gcc 3.3.5 und 4.1.1 akzeptieren den
Code. |
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Sat Sep 30, 2006 3:20 am Post subject: Re: Typ von Klassen in Klassentemplates |
|
|
Boris Glawe schrieb:
| Quote: | g++ -o test test.cpp -Wall -O3
test.cpp:53: Fehler: expected constructor, destructor, or type
conversion before »&« token
test.cpp: In constructor »Master<T>::Master(T&) [with T = char]«:
test.cpp:78: instantiated from here
test.cpp:41: Fehler: Abhängigenname »Master<T>::Nested« wird als
Nicht-Typ erkannt, aber die Instanziierung liefert einen Typ
test.cpp:41: Anmerkung: »typename Master<T>::Nested« sagen, wenn ein Typ
gemeint ist
|
Hier beschleicht mich das Gefühl, dass irgendwo ein "typename" fe lt ....
| Quote: | /*
Das Aufrufen des Konstruktors "Master<T>::Nested()"
schlaegt fehl. Wie lautet der korrekt Name des Konstruktors?
*/
template <typename T
Master<T>::Master(T& dv) :
nested( Master<T>::Nested() ),
|
.... und es trog nicht. Mit
nested( typename Master<T>::Nested() ),
klappt's - "Master<T>::Nested" ist eben ein "abhängiger Name" und drum
muss man dem Compiler sagen, dass es sich um den Namen eines Typen
handelt - ansonsten könnte es ja schließlich eine Spezialisierung von
"Master" geben, in welcher "Nested()" eine Member-Funktion ist.
(Anmerkung: Ältere Compiler haben's oft mit dem "typename" nicht so
genau genommen und hätten obiges eventuell geschluckt.)
Außerdem könnte man hier einfach
nested(),
oder gleich gar nix schreiben (es sei denn, es wird Wert auf den Aufruf
eines Kopier-Konstruktors gelegt), da "nested" sowieso
default-konstruiert (<= was für'n Verb!) wird.
| Quote: | dummyValue(dv)
{}
/*
Hier mault der Kompiler, weil er mit dem Typ
"Master<T>::Nested &" nichts anfangen kann.
Wenn ich mich nicht taeuschen, dann ist das aber
der Typ der Instanzvariablen "nested"!?
*/
template <typename T
Master<T>::Nested & getNested const
|
Hier fehlen
1. "typename",
2. Funktionsklammern und
3. dass "getNested()" zu "Master<T>" gehört.
Also
typename Master<T>::Nested & Master<T>::getNested() const
| Quote: | {
return nested;
}
|
MfG
Falk |
|
| 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
|
|