Frage zu C++-Konstrukt: Syntaktisch korrekt?
-
Hi Leute,
folgendes kleine Programm kann ich mit keiner Version des Visual Studios kompilieren... Meiner Meinung nach müsste das aber korrekt sein.
// CompilerTest.cpp : Defines the entry point for the console application. // #include <iostream> class A { public: A(int i){m_i=i;} int m_i; }; class B { public: B(A a){m_j=a.m_i;} int m_j; }; void Test(B &b) { std::cout << b.m_j; } int main(int argc, char* argv[]) { int n=5; B b(A(n)); // <-- Test(b); return 0; }In der markierten Zeile bekomme ich folgenden Fehler:
- VC++ 6.0: error C2664: 'Test' : cannot convert parameter 1 from 'class B (class A)' to 'class B &'
Context does not allow for disambiguation of overloaded function - VS.NET 2003: "error C2664: 'Test' : cannot convert parameter 1 from 'B (A)' to 'B &'
A reference that is not to 'const' cannot be bound to a non-lvalue" - VS 2005: error C2664: 'Test' : cannot convert parameter 1 from 'B (__cdecl *)(A)' to 'B &'
Wenn man die main etwas abändert tut es übrigens:
int main(int argc, char* argv[]) { B b(A(5)); Test(b); return 0; }oder:
int main(int argc, char* argv[]) { int n=5; Test(B(A(n))); return 0; }oder:
int main(int argc, char* argv[]) { int n=5; A a(n); B b(a); Test(b); return 0; }Ist das ein Compiler-Bug oder übersehe ich irgendetwas?
- VC++ 6.0: error C2664: 'Test' : cannot convert parameter 1 from 'class B (class A)' to 'class B &'
-
B b((A(n))); // <--So gehts auf jeden Fall. Es gibt da irgend so eine Regel ( die ich noch nie verstanden habe ) die sagt wenns aussieht wie eine deklaration dann ist's eine deklaration ( oder so ähnlich ).
Kurt
-
Also nur zur Info im GCC 4.0.2 kommt folgendes dazu:
Fehler: ungültige Initialisierung einer nicht-konstanten Referenz des Typs »B&« von temporärem Wert des Typs »B (*)(A)«
-
Danke euch beiden. Scheint also kein Bug zu sein.
-
icepacker schrieb:
Also nur zur Info im GCC 4.0.2 kommt folgendes dazu:
Fehler: ungültige Initialisierung einer nicht-konstanten Referenz des Typs »B&« von temporärem Wert des Typs »B (*)(A)«
eben es schaut so aus als ob du eine funktion
B b(A);declarieren würdest.
Kurt
-
Ich wusste garnicht, dass man in C++ Funktionen innerhalb von Funktionen deklarieren kann...
-
Doch deklarieren kannst du überall.
Kurt