Basisklasse mit gleichem Namen im Namespace



  • Hallo!

    Vorab: Ich stelle diese Frage hier, weil das Problem offenbar nur mit MSVC6 auftaucht. Hier erstmal der Demo-Code:

    namespace ns 
    {
        class X 
        {
        public:
            virtual int foo() { return 1; }
        };
    } // namespace ns
    
    class X : public ns::X
    {
        typedef ns::X BaseType;
    public:
        int foo() 
        {
            // Hier tritt das Problem auf:
            // Es wird die Memberfunktion der abgeleiteten
            // Klasse aufgerufen -> Endlosrekursion
            return BaseType::foo(); 
        }
    };
    
    int main(int argc, char* argv[])
    {
        X x;
        x.foo();
    }
    

    Ich habe also eine abgeleitete Klasse, die genauso heißt wie die Basisklasse, welche allerdings in einem Namespace steckt. Der typedef ist notwendig, weil MSVC6 das sonst gar nicht kompiliert (d.h. return ns::X::foo(); geht nicht). Das funktioniert auch, solange die Klassen nicht denselben Namen haben.

    Leider kann ich durch andere Bedingungen des Projekts die Namen der Klassen nicht ändern. Hat jemand einen Tipp für mich, außer den Compiler zu wechseln?



  • Tipp 1: Lass dich nach Standard-C++ verschieben...
    Tipp 2: Das was du willst sollte IMHO eigentlich gehen. Ist aber schlechter Stil

    [ Dieser Beitrag wurde am 12.06.2003 um 10:33 Uhr von MaSTaH editiert. ]



  • Original erstellt von MaSTaH:
    **Tipp 1: Lass dich nach Standard-C++ verschieben...
    Tipp 2: Das was du willst sollte IMHO eigentlich gehen. Ist aber schlechter Stil
    **

    Ich weiß, dass das gehen müsste, und ich weiß, dass das nicht schön ist. Es geht mit MSVC7.1 und Dev-C++. Darum ist das ja auch kein Thema für Standard-C++. Es geht darum, dass es eben nur mit MSVC6 nicht funktioniert, ich aber keinen anderen Compiler verwenden kann.



  • Naja, der MSC 6 ist nicht der standardkonformste Compiler. Was machst du denn bitte für ein Projekt? Du kannst die Klasse nicht umbenennnen aber auch nicht auf ne andere Entwicklungsumgebung umsteigen? Komisch! Seit wann ist Dev-C++ eigentlich ein Compiler? 😕



  • Original erstellt von MaSTaH:
    Naja, der MSC 6 ist nicht der standardkonformste Compiler.

    Was du nicht sagst 🙄

    Was machst du denn bitte für ein Projekt? Du kannst die Klasse nicht umbenennnen...

    Grob gesagt, geht es um "Codeinstrumentalisierung" zu Testzwecken. In einem bestehenden Projekt soll eine Klasse durch eine andere mit gleichem Namen ersetzt werden, durch die man Kontrolle über die Funktionsaufrufe hat. Das soll mit möglichst geringen und möglichst wenig verteilten Eingriffen in den Code geschehen.

    ... aber auch nicht auf ne andere Entwicklungsumgebung umsteigen? Komisch!

    Tja, so kann's einem gehen. Manchmal gibt es Pflichtenhefte, und es gibt Kunden, die nicht gut darauf reagieren, wenn man ihnen sagt, dass sie ihr Projekt auf eine andere Entwicklungsumgebung portieren müssen. Willkommen im wirklichen Leben.

    Seit wann ist Dev-C++ eigentlich ein Compiler? 😕

    Keine Ahnung. Wer hat Dev-C++ als Compiler bezeichnet?

    Ach ja, folgendes funktioniert übrigens:

    namespace ns 
    {
        class X 
        {
        public:
            virtual int foo() { return 1; }
        };
    } // namespace ns
    
    template <class BaseType>
    class templateX : public BaseType
    {
    public:
        int foo() 
        {
            return BaseType::foo(); 
        }
    };
    
    typedef templateX<ns::X> X;
    
    int main(int argc, char* argv[])
    {
        X x;
        x.foo();
    }
    

Anmelden zum Antworten