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?



  • 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


Log in to reply