Warum gibt mir dir Compiler so extrem viel aus?
-
Mal abgesehen von der Fehlermeldung.
Sehe ich das in deinem Screenshot richtig, dass du eine 'nackte' Header-File kompilieren willst?!
Oder sind meine Augen um die Zeit noch nicht so gut?
-
dekcarki schrieb:
Mal abgesehen von der Fehlermeldung.
Sehe ich das in deinem Screenshot richtig, dass du eine 'nackte' Header-File kompilieren willst?!
Oder sind meine Augen um die Zeit noch nicht so gut?So nackt ist sie nicht °~°
#ifndef WASSERFLASCHE_H #define WASSERFLASCHE_H #include <iostream> using namespace std; class Wasserflasche { private: int gewicht; string beschriftung; public: Wasserflasche(int gewicht, string beschriftung); void print_data(); }; Wasserflasche::Wasserflasche(int gewicht, string beschriftung) { this->gewicht = gewicht; this->beschriftung = beschriftung; } void Wasserflasche::print_data() { cout << "Ich wiege " << gewicht << " KG und auf mir steht " << beschriftung << " - Laenge der Beschriftung: " << beschriftung.length() << endl; } #endifDas vorhin war nur ein extract, daher die "...".
Und ja, danke, es funktioniert mit length() (:
Das Problem ist daran nur einfach, dass ich aus der Medlung kaum etwas entnehmen kann ... ein "member field 'length' was not defined" hätte mir wesentlich mehr geholfem
-
Header-Dateien kompiliert man i.d.R. nicht. Jedenfalls macht man daraus keine Objekt-Dateien. Der GCC erkennt aber die für Header typische Dateiendung und erzeugt einen vorkompilierten Header (gch = g compiled header). Das bringt Dir aber nur unter gewissen Umständen etwas und kann auch zu Problemen führen, wenn etwa das Kompilat (gch) nicht auf dem aktuellen Stand ist. An Deiner Stelle würde ich es sein lassen, es sei denn, Deine Code-Basis ist so umfangreich, dass Du mit vorkompilierten Headerdateien echt Compilizerzeit sparen kannst und willst.
Gruß,
SP
-
Sebastian Pizer schrieb:
An Deiner Stelle würde ich es sein lassen, es sei denn, Deine Code-Basis ist so umfangreich, dass Du mit vorkompilierten Headerdateien echt Compilizerzeit sparen kannst und willst.
Ich habe die Erfahrung gemacht, dass es sich bereits auch bei kleineren Projekten lohnen kann vorkompilierte Header zu nutzen. Klar ist es nicht tragisch, wenn es halt mal 20, anstatt 10 Sekunden kompiliert, aber es macht doch einen Unterschied. (hängt halt auch noch vom verwendeten PC ab..)
-
C-reator schrieb:
Das Problem ist daran nur einfach, dass ich aus der Medlung kaum etwas entnehmen kann ... ein "member field 'length' was not defined" hätte mir wesentlich mehr geholfem

Diese Meldung ist aber falsch, da length als Member duchaus existiert. Es hat den Typ size_t (std::string::*)() (oder so ähnlich) und für diesen Typ hat cout keinen <<-Operator.
-
XMaster schrieb:
C-reator schrieb:
Das Problem ist daran nur einfach, dass ich aus der Medlung kaum etwas entnehmen kann ... ein "member field 'length' was not defined" hätte mir wesentlich mehr geholfem

Diese Meldung ist aber falsch, da length als Member duchaus existiert. Es hat den Typ size_t (std::string::*)() (oder so ähnlich) und für diesen Typ hat cout keinen <<-Operator.
Ach so, okay; ich habe jetzt gedacht, es hätte daran gelegen, dass er "length" anstatt "length()" nicht versteht, weil er denken würde, das sei ein Member, aber er auf diesen nicht zugreifen könnte, da er privat ist und er somit gar keinen Member findet und sagen würde, es würde keiner definiert sein.
-
XMaster schrieb:
Diese Meldung ist aber falsch, da length als Member duchaus existiert. Es hat den Typ size_t (std::string::*)()
Das stimmt so nicht. Laut 5.2.5/4 ("class member access") kann der Ausdruck
einstringobjekt.lengthnur für die Anwendung des Funktionsaufruf-Operators benutzt werden. Den Typ dieses Ausdrucks kann man gar nicht aufschreiben. Einen Elementfunktionszeiger bekommt man nur über&string::length-- zumindest ist das der einzige vom Standard garantierte Weg, an einen solchen Zeiger zu kommen.Gruß,
SP
-
Sebastian Pizer schrieb:
XMaster schrieb:
Diese Meldung ist aber falsch, da length als Member duchaus existiert. Es hat den Typ size_t (std::string::*)()
Das stimmt so nicht. Laut 5.2.5/4 ("class member access") kann der Ausdruck
einstringobjekt.lengthnur für die Anwendung des Funktionsaufruf-Operators benutzt werden. Den Typ dieses Ausdrucks kann man gar nicht aufschreiben. Einen Elementfunktionszeiger bekommt man nur über&string::length-- zumindest ist das der einzige vom Standard garantierte Weg, an einen solchen Zeiger zu kommen.Gruß,
SPDarf man fragen, worauf sich "5.2.5/4" bezieht?
Durch schlagfertiges Googeln habe ich herausgefunden, dass es um den "C++ Standard" geht (oder vermutlicht eine Erweiterung dessen?) ...
-
Darf man fragen, worauf sich "5.2.5/4" bezieht?
EDIT by PhoemueX: Ich glaube nicht, dass der hier gepostete Link legal war. Unterlasse das in Zukunft bitte.
-
Sebastian Pizer schrieb:
Den Typ dieses Ausdrucks kann man gar nicht aufschreiben.
Das geht schon - jedenfalls wenn die nichtstatischen Memberfunktion weder const noch volatile ist - hier:
std::string::size_type()also ein Funktionstype. Mit dem Unterschied zu normalen Funktionsausdrücken, dass wir es hier mit einem rvalue zu tun haben.
-
C-reator schrieb:
Darf man fragen, worauf sich "5.2.5/4" bezieht?
Durch schlagfertiges Googeln habe ich herausgefunden, dass es um den "C++ Standard" geht (oder vermutlicht eine Erweiterung dessen?) ...Ja, sorry! Hätte das erwähnen können. ISO 14882:2003 "Programming Language C++", Abschnitt 5.2.5 Paragraph 4, Unterpunkt 3:
If E2 is a (possibly overloaded) member function, function overload resolution (13.3) is used to determine whether E1.E2 refers to a static or a non-static member function.
- If it refers to a static member function, and the type of E2 is “function of parameter-type-list returning T”, then E1.E2 is an lvalue; the expression designates the static member function. The type of E1.E2 is the same type as that of E2, namely “function of parameter-type-list returning T”.
- Otherwise, if E1.E2 refers to a non-static member function, and the type of E2 is “function of parametertype-list cv returning T”, then E1.E2 is not an lvalue. The expression designates a non-static member function. The expression can be used only as the left-hand operand of a member function call (9.3). [ Note: any redundant set of parentheses surrounding the expression is ignored (5.1). —end note ] The type of E1.E2 is “function of parameter-type-list cv returning T”.
...wobei der letzte Satz aber auch mein "Den Typ dieses Ausdrucks kann man gar nicht aufschreiben" widerlegt. Zumindest ist der Typ (wenn "cv" nicht leer ist) kein Typ in dem Sinne, dass ich ein typedef dafür anlegen könnte.
Gruß,
SP