2015-07-11 82 views
0

我在嘗試編譯我的代碼時遇到以下錯誤。Can not dynamic_cast

ERROR! ..\myCode\CPOI.cpp:68:41: error: cannot dynamic_cast 'screenType' (of type 'struct CScreen*') to type 'struct CGUIScreen*' (target is not pointer or reference to complete type)

這是我的代碼:

基類:

#include "CRoute.h" 

enum screen_t{CRTScreen,GUIScreen}; 

class CScreen 
{ 
    protected:  
     CRoute* m_pRoute; 

    public:  
     virtual ~CScreen(); 
     virtual void connecToRoute(CRoute* route) = 0; 
     virtual void drawRoute() = 0; 
     virtual screen_t getScreenType() = 0; 
}; 

派生類:

#include "CScreen.h" 

class CGUIScreen : public CScreen 
{ 
    public: 
     void drawRoute(); 
     screen_t getScreenType(); 
     void connecToRoute(CRoute* route); 
}; 

和錯誤:

void CPOI::print(int format, CScreen* screenType) 
{ 
    if(dynamic_cast<CGUIScreen*>(screenType)) 
    { 
     cout << "printing POI GUI " << endl; 
    } 
} 

爲什麼發生?

+1

也在派生類中創建虛擬方法,然後重試。您必須重寫所有純虛函數。 – Jepessen

+0

請發佈[最小,完整和可驗證的示例](http://www.stackoverflow.com/help/mcve)。這裏沒有什麼看起來錯你確定你包含了派生類的定義嗎? – Barry

回答

1

您尚未顯示足夠的代碼,因此只能猜測。

該錯誤可能是因爲在編譯違規語句時,編譯器只能看到CGUIScreen(也可能是CScreen)的正向聲明。該解決方案將定義爲CGUIScreen類的頭文件,因此編譯器可以看到dynamic_cast的完整類定義。

或者換句話說,像class CGUIScreen;這樣的前向聲明對於像dynamic_cast<CGUIScreen*>(screenType)這樣的表達式是不夠的。完整的類定義是必需的。

+0

對不完整的代碼。你是對的,謝謝。 – kender6