Fehlersuche: Problem beim Aufruf von operator!=
-
ba::parsetree& ba::parse( lexer& source, parsetree& dest ) { // source.get_next() -> const ba::token& ba::lexer::get_next() // lexer::end ist ein static member vom typ const token while ( source.get_next() != lexer::end ) { } return dest; }inline bool operator==( const token& tok ) const; inline bool operator!=( const token& tok ) const;-------------- Build: debug in core ---------------
Compiling: parser.cpp
/home/wyfrn/projects/studium/ba2/core/parser.cpp: In function »ba::parsetree& ba::parse(ba::lexer&, ba::parsetree&)«:
/home/wyfrn/projects/studium/ba2/core/parser.cpp:7: Fehler: no match für »operator!=« in »((ba::lexer*)source)->ba::lexer::get_next() != ba::lexer::end«
/home/wyfrn/projects/studium/ba2/core/token.hpp:96: Anmerkung: Kandidaten sind: bool ba::token::operator!=(const ba::token&) const
Process terminated with status 1 (0 minutes, 1 seconds)
2 errors, 0 warningsInsbesondere die zweite Zeile der Fehlermeldung kann ich grad garnicht nachvollziehen. Fällt jemandem etwas auf oder habt ihr vlt Tipps / Hinweise den Fehler einzugrenzen! Schonmal ein Danke im Voraus!
-
quarx schrieb:
ba::parsetree& ba::parse( lexer& source, parsetree& dest ) { // source.get_next() -> const ba::token& ba::lexer::get_next() // lexer::end ist ein static member vom typ const token while ( source.get_next() != lexer::end ) { } return dest; }inline bool operator==( const token& tok ) const; inline bool operator!=( const token& tok ) const;-------------- Build: debug in core ---------------
Compiling: parser.cpp
/home/wyfrn/projects/studium/ba2/core/parser.cpp: In function »ba::parsetree& ba::parse(ba::lexer&, ba::parsetree&)«:
/home/wyfrn/projects/studium/ba2/core/parser.cpp:7: Fehler: no match für »operator!=« in »((ba::lexer*)source)->ba::lexer::get_next() != ba::lexer::end«
/home/wyfrn/projects/studium/ba2/core/token.hpp:96: Anmerkung: Kandidaten sind: bool ba::token::operator!=(const ba::token&) const
Process terminated with status 1 (0 minutes, 1 seconds)
2 errors, 0 warningsInsbesondere die zweite Zeile der Fehlermeldung kann ich grad garnicht nachvollziehen. Fällt jemandem etwas auf oder habt ihr vlt Tipps / Hinweise den Fehler einzugrenzen! Schonmal ein Danke im Voraus!
Ich kann nur vermuten... Wenn du das Problem einfach lösen willst, dann schreibe dir eine Funktion has_next().
while (lexer.has_next()) { token t = lexer.get_next(); }Für eine direkte Lösung deines Problems ist aber nicht wirklich genug Code vorhanden.
-
Danke schonmal für dein Bemühen. Ich versuche immer so wenig wie möglich Code zu posten, weils meistens ehr abschreckend auf die Leser wirkt.
Allerdings konnte ich das Problem eingrenzen. Die Ursache wird in folgendem Beispiel deutlich:typedef enum { foo2, foo4 } foo_t; struct bar { explicit bar( const foo_t ft ) : m_ft( ft ) { } foo_t m_ft; }; struct test { static const bar my_bar( foo_t( foo2 ) ); }; void do_something( const bar& ); int main() { do_something( test::my_bar ); return 0; } void do_something( const test& ) { }-------------- Build: debug in cnf ---------------
Compiling: main.cpp
/home/wyfrn/projects/studium/ba2/cnf/main.cpp: In function »int main()«:
/home/wyfrn/projects/studium/ba2/cnf/main.cpp:32: Fehler: ungültige Initialisierung einer Referenz des Typs »const bar&« von Ausdruck des Typs »const bar (*)(foo_t)«
/home/wyfrn/projects/studium/ba2/cnf/main.cpp:28: Fehler: bei Übergabe des Arguments 1 von »void do_something(const bar&)«
Process terminated with status 1 (0 minutes, 1 seconds)
2 errors, 0 warningsDas Problem is die Umwandlung von test::my_bar in const bar&. Wenn ich weiß, wie ich das hier hinbekomme, läuft auch der andere Code.
Was mit beim testen noch aufgefallen ist:
typedef enum { foo2, foo4 } foo_t; struct bar { explicit bar( const foo_t ft ) : m_ft( ft ) { } foo_t m_ft; }; struct test { static const bar my_bar( foo2 ); }; void do_something( const bar& ); int main() { do_something( test::my_bar ); return 0; } void do_something( const test& ) { }Wenn ich den static member auf diese Weise initialisiere, meldet der Compilier folgendes:
-------------- Build: debug in cnf ---------------
Compiling: main.cpp
/home/wyfrn/projects/studium/ba2/cnf/main.cpp:25: Fehler: »foo2« is not a type
/home/wyfrn/projects/studium/ba2/cnf/main.cpp: In function »int main()«:
/home/wyfrn/projects/studium/ba2/cnf/main.cpp:32: Fehler: ungültige Initialisierung einer Referenz des Typs »const bar&« von Ausdruck des Typs »const bar (*)(int)«
/home/wyfrn/projects/studium/ba2/cnf/main.cpp:28: Fehler: bei Übergabe des Arguments 1 von »void do_something(const bar&)«
Process terminated with status 1 (0 minutes, 1 seconds)
3 errors, 0 warningsDie Meldung für Zeile 25 kann ich nicht nachvollziehen. Vieleicht kann mich da jemand aufklären?
-
Hi,
man kann nur einfache Datentypen wie "int", "float" usw bei static const Membern in der Deklaration der Klasse zuweisen. Sollte also so sein:
struct test { // Deklaration static const bar my_bar; }; // Definition const bar test::my_bar = foo_t( foo2 );Ansonsten sieht auch der Code in deinem Eingangspost für mich korrekt aus.
-
enum foo_t { foo2, foo4 }; struct bar { explicit bar( const foo_t ft ) : m_ft( ft ) { } foo_t m_ft; }; struct test { static const bar my_bar; }; const bar test::my_bar(foo2); // Initialisierung void do_something( bar a ); // Kein & mehr int main() { do_something( test::my_bar ); return 0; } void do_something( bar a ) // Kein & mehr { }
-
Besten Dank, es funktioniert. Wenn ich mir jetzt nochmal die Fehlermeldung anschau, dann fällt mir auch auf, dass meine vermeintliche Initialisierung als Funktionsdeklaration aufgefasst wird oO
-
[quote=asdasdasd]Im Originalcode muss es aber zwingend eine Referenz sein.[/quote]
So läufts:
typedef enum { foo2, foo4 } foo_t; struct bar { bar( const foo_t ft ) : m_ft( ft ) { } foo_t m_ft; }; struct test { static bar my_bar; }; bar test::my_bar = foo2; void do_something( const bar& ); int main() { do_something( test::my_bar ); return 0; } void do_something( const bar& ) { }