PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Neues Objekt als Ctor-Parameter



BLUESCREEN3D
12-02-2009, 22:27
#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():

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?

anda_skoa
13-02-2009, 14:29
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,
_

locus vivendi
13-02-2009, 14:41
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.

BLUESCREEN3D
13-02-2009, 16:53
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 :D
Bin eben schon auf folgendes gestoßen, was auch funktioniert, aber etwas unschön ist:

test b(static_cast<string>(string()));