无法dynamic_cast

时间:2015-07-11 22:42:27

标签: c++ class casting abstract-class

尝试编译代码时出现以下错误。

  

ERROR! .. \ myCode \ CPOI.cpp:68:41:错误:无法dynamic_cast   ' screenType' (类型' struct CScreen *')键入' struct CGUIScreen *'   (目标不是指针或对完整类型的引用)

这是我的代码:

基类:

#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 个答案:

答案 0 :(得分:1)

您没有显示足够的代码,因此只能猜测。

错误可能是因为,在编译违规语句时,编译器只能看到CGUIScreen(也可能是CScreen)的前向声明。解决方案是#include定义CGUIScreen类的头文件,因此编译器可以看到dynamic_cast的完整类定义。

或者,换句话说,像class CGUIScreen;之类的前向声明对dynamic_cast<CGUIScreen*>(screenType)之类的表达式来说还不够。需要完整的类定义。