2012-11-07 14 views
5

Poniższy kod nie kompilacji w Visual Studio 2005:Obejście dla Visual Studio 2005 C++ dziedziczenie 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); 
} 

Wyjście build to:

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' 

Gdybym wykomentuj linie oznaczone Problem line 1 i Problem line 2 to buduje OK. Tak więc użycie przesłaniania nie stanowi problemu, ani nie dziedziczy po klasie zagnieżdżonej. Wydaje się mieć problem z ustaleniem, która klasa Delegata jest właściwa do użycia.

Ten problem nie istnieje w VC2008.

Czy ktoś może zaproponować obejście tego problemu? Poza oczywistym: uaktualnij do nowoczesnego kompilatora!

Ponadto, byłbym wdzięczny, gdyby ktoś mógł wskazać dowolną dokumentację błędu (jeśli jest to błąd).

Edit: @Anonymous Coward zasugerował użycie typedefs będzie skompilować jeśli OriginalClass zmienia się na następujące:

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

Dlaczego tak naprawdę nie można użyć innego kompilatora? Sam błąd jest całkiem jasny, z czym kompilator ma problem, masz inny dowód, jest to błąd kompilatora, a po prostu nie fakt, że kompilatorowi brakuje tej możliwości? –

+0

@Ramhound Powodem, dla którego muszę się trzymać 2005 jest to, że muszę obsługiwać stare urządzenie Wince, do którego mam tylko pakiet SDK 2005. Nie wiem, czy to błąd, ale muszę jeszcze skompilować ten kod. – Eoghan

Odpowiedz

2

To wydaje się być rzeczywiście problem z rozpoznawaniem nazw. Kompiluje się przy użyciu maszyn typu:

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

To jest wspaniałe, dziękuję. Musisz tylko zmienić nazwę OriginalClass :: Delegate i typedef, aby to zadziałało. – Eoghan

Powiązane problemy