2012-11-07 6 views
5

Der folgende Code nicht in Visual Studio nicht kompiliert 2005:Behelfslösung für ein Visual Studio 2005 C++ Vererbung Bug

class OriginalClass 
{ 
public: 
    class Delegate 
    { 
     virtual void original_func()=0; 
    }; 
}; 

class BaseClass 
    :public OriginalClass::Delegate // Problem line 1 
{ 
public: 
    class Delegate 
    { 
     virtual void base_func(int x) = 0; 
    }; 

    void original_func()override{} // Problem line 2 
}; 

class DerivedClass : public BaseClass::Delegate 
{ 
public: 
    virtual void base_func(int x) override {}; 
}; 

int main() 
{ 
    DerivedClass derived_object; 

    derived_object.base_func(10); 
} 

Die Build-Ausgabe lautet:

1>inherit\main.cpp(26) : error C3668: 'DerivedClass::base_func' : method with override specifier 'override' did not override any base class methods 
1>inherit\main.cpp(32) : error C2259: 'DerivedClass' : cannot instantiate abstract class 
1>  due to following members: 
1>  'void OriginalClass::Delegate::original_func(void)' : is abstract 
1>  inherit\main.cpp(7) : see declaration of 'OriginalClass::Delegate::original_func' 

Wenn ich die Zeilen auf Kommentar markiert Problem Zeile 1 und Problem Zeile 2 es baut OK. So ist die Verwendung von override kein Problem, noch erbt von der geschachtelten Klasse. Es scheint schwierig zu sein herauszufinden, welche Delegate-Klasse die richtige ist.

Dieses Problem existiert in VC2008 nicht.

Kann jemand eine Abhilfe für diese vorschlagen? Neben dem Offensichtlichen: Upgrade auf einen modernen Compiler!

Auch ich würde es schätzen, wenn jemand auf irgendeine Dokumentation des Fehlers zeigen kann (wenn es ein Fehler ist).

Edit: @Anonymous Coward vorgeschlagen typedefs verwendet wird, wird es kompilieren, wenn die OriginalClass wie folgt geändert wird:

class OriginalClass 
{ 
public: 
    class Delegate_t 
    { 
     virtual void original_func()=0; 
    }; 
    typedef Delegate_t Delegate; 
}; 
+0

Der Grund, warum Sie nicht einen anderen Compiler verwenden können, ist was genau? Der Fehler selbst ist ziemlich klar, was der Compiler ein Problem hat, haben Sie einen anderen Beweis, das ist ein Compiler-Fehler, und einfach nicht die Tatsache, dass der Compiler diese Fähigkeit fehlt? –

+0

@Ramhound Der Grund, warum ich bei 2005 bleiben muss, ist, dass ich ein altes Wince-Gerät unterstützen muss, für das ich nur ein 2005 SDK habe. Ich weiß nicht, ob es ein Bug ist, aber ich muss diesen Code irgendwie kompilieren. – Eoghan

Antwort

2

Das in der Tat eine Namensauflösung Problem zu sein scheint. Es kompiliert bei der Verwendung von typedefs:

class OriginalClass { 
    // class Delegate { ... }; 
    typedef Delegate delegate_t; 
}; 

class BaseClass : public OriginalClass::delegate_t { 
    // class Delegate { ... }; 
    typedef Delegate delegate_t; 
}; 

class DerivedClass : public BaseClass::delegate_t { 
    // ... 
}; 
+0

Das ist brilliant, danke. Sie müssen nur den Namen von OriginalClass :: Delegate und typedef ändern, damit es funktioniert. – Eoghan