Standardcompilerproblem mit Templates.... Was überseh ich?
-
template <class T, unsigned long DIM> class vector { public: .... vector(); vector(T*); vector(const vector<T, DIM>&); size_type dimension() const; .... private: T data[DIM]; }; ... template <class T, unsigned long DIM> vector<T, DIM>::vector(T* data_) { ... } template <class T, unsigned long DIM> vector<T, DIM>::vector(const vector<T, DIM>& x) { for(size_type n = 1; n != DIM+1; ++n) { data[n] = x.data[n-1]; } } template <class T, unsigned long DIM> size_type vector<T, DIM>::dimension() const /// ZEILE 70 { return DIM; }Vermeintlich unwichtige Sachen entfernt
70 expected constructor, destructor, or type conversion before "vector"
70 expected `;' before "vector"Vermutlich trivial

-
dein size_type ist bei der Deklaration des Rückgabetypen noch nicht im Scope - an dieser Stelle ist ja noch gar nicht klar, dass es um ein Member deines Templates geht. also:
template <class T, unsigned long DIM> vector<T, DIM>::size_type vector<T, DIM>::dimension() constAn jeder anderen Stelle der Deklaration ist das nicht notwendig.
-
Trivial und dumm wie ich mir dachte

Danke
-
Den Fehler macht jeder mal und so gut wie jeder dürfte bei den ersten malen ziemlich lange dran rumrätseln - schließlich entsteht das ja fast automatisch durch c&p. Trivial ja, dumm vielleicht, aber du bist in guter Gesellschaft

-
Schlag mich tot - Fehler gefunden
Edit: Doch nicht - immer noch derselbe und keine weiteren Hinkefüße gefunden
-
Versuch mal
template <class T, unsigned long DIM> typename vector<T, DIM>::size_type vector<T, DIM>::dimension() const
-
Und genau deswegen fände ich es gut, wenn auch der Rückgabetyp zum Scope der Klasse gezählt werden würde (so wie bei den Parametern und in den Klassendeklarationen).
Dies ist meiner Ansicht nach einfach überflüssige Schreibarbeit...
Vielleicht kommt dies ja für C++0x...
-
Th schrieb:
Vielleicht kommt dies ja für C++0x...
Wenn du das JETZT nicht weißt, kommts nicht mehr.
-
Danke das typename behebt das Problem.
Der Sinn dieses Schlüsselwortes erschliesst sich mir hingegen gar nicht. Warum muss ich das jedes mal außerhalb des Klassenscopes davor klatschen.
-
Das Schlüsselwort 'typename' mußt du immer bei verschachtelten Datentypen (innerhalb von Templates-Definitionen) angeben, da sonst der Compiler beim zweiten Namen von einer Variablen ausgeht:
vector<T, DIM>::size_type; // Annahme des Compilers: size_type ist eine Membervariable typename vector<T, DIM>::size_type; // size_type ist ein DatentypDaß der Compiler eigentlich bei einem Rückgabetyp vom 2. Fall ausgehen kann, und man trotzdem typename davorschreiben muß, liegt an der fehlenden Semantikprüfung.
Artchi schrieb:
Wenn du das JETZT nicht weißt, kommts nicht mehr.
Wie soll ich das jetzt verstehen? Ich weiß leider gar nicht so viel, was wirklich im kommenden Standard kommen soll.
Auch wenn ich in einem anderen Thread schon mal die Änderungen anhand eines Draft-Dokuments aufgelistet habe.(Ich glaube, ich muß mir doch irgendwann mal meine eigene Sprache entwerfen: Th++
)
-
Den Rückgabewert auch dann, wenn er zuerst kommt, nach der Funktionssignatur zu parsen, scheint man den Compilerherstellern offenbar nicht zuzutrauen, deshalb soll IIRC eine neue Syntax erlauben, den Rückgabewert mit dem "->"-Operator hintanzustellen.