Anzeige:
Ergebnis 1 bis 4 von 4

Thema: C++: Neues Objekt als Ctor-Parameter

  1. #1
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665

    C++: Neues Objekt als Ctor-Parameter

    Code:
    #include <string>
    
    using namespace std;
    
    struct test
    	{
    	test(string s) {}
    	void f() {}
    	};
    
    int main()
    	{
    	string tmp;
    	test a(tmp);
    	test b(string());
    
    	a.f();
    	b.f();
    	}
    Wenn ich versuche, das zu kompilieren, erhalte ich folgende Fehlermeldung für die Zeile b.f():
    Code:
    error: request for member ‘f’ in ‘b’,
    which is of non-class type ‘test ()(std::string (*)())’
    b sollte eigentlich das gleiche Objekt sein wie a, aber irgendwie scheint es ein anderer Typ zu sein - aber was? Und warum?

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Das gehört zu den eher trickreichen Sachen bei C++.

    Was dir der Compiler hier mitteilt ist, dass die Deklaration von "b" keine Deklaration einer Variablevom Typ "test", sondern einer Funktion mit dem Rückgabewert "test" ist.

    Am Besten du verpasst "test" einfach einen Defaultkonstruktor.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Du bist auf "C++'s most vexing parse" gestoßen. Hintergrund:
    http://parashift.com/c++-faq-lite/ctors.html#faq-10.19

    Statt dem dort vorgeschlagenem "Foo x = Foo(Bar());" könntest du übrigens auch "Foo x((Bar()));" benutzen.

  4. #4
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Zitat Zitat von locus vivendi Beitrag anzeigen
    Statt dem dort vorgeschlagenem "Foo x = Foo(Bar());" könntest du übrigens auch "Foo x((Bar()));" benutzen.
    Danke, test b((string())) ist eine akzeptable Lösung
    Bin eben schon auf folgendes gestoßen, was auch funktioniert, aber etwas unschön ist:
    Code:
    test b(static_cast<string>(string()));

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •