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 

Typ von Klassen in Klassentemplates

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





PostPosted: Fri Sep 29, 2006 6:04 pm    Post subject: Typ von Klassen in Klassentemplates Reply with quote



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





PostPosted: Fri Sep 29, 2006 9:37 pm    Post subject: Re: Typ von Klassen in Klassentemplates Reply with quote



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





PostPosted: Sat Sep 30, 2006 3:20 am    Post subject: Re: Typ von Klassen in Klassentemplates Reply with quote



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
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.