2013-03-13 3 views
1

Я пытаюсь static_cast объект интерфейса в объект производного класса, который наследует этот интерфейс. Я получаю сообщение об ошибкеstatic_cast интерфейс к производному классу

«static_cast»: не удается преобразовать из «IInherit *» до 'cDerived *

Производный класс и интерфейс следующего формата.

class cDerived: public IInherit 
{ 
    Repo* p_Repos; 
public: 
    cDerived(Repo* pRepos) 
    { 
     p_Repos = pRepos; 
    } 
    Repo* GetRepo() 
    { 
      return p_Repos; 
    } 
    void doAction(ITok*& pTc) 
    { 
     ///some logic 
    } 

} 

class IInherit 
{ 
public: 
    virtual ~IInherit() {} 
    virtual void doAction(ITok*& pTc)=0; 
}; 

У меня есть vector<IInherit*> объект доступный в коде через getInherit() метод таким образом, что тип getInherit() [0] cDerived * Я выполняя статический бросок, используя выражение:

Repo* pRep= static_cast<cDerived*>(getInherit()[0])->GetRepo(); 

Я не уверен, что в качестве объекта интерфейса можно использовать static_cast. Есть ли другой способ, которым я мог бы выполнить этот актерский состав?

+0

Какой у вас компилятор? Это [работает для меня] (http://ideone.com/ESohQ3). –

+2

Можете ли вы представить полный пример, показывающий ошибку и полное сообщение об ошибке? – JoergB

+1

Являются ли ** определения ** 'IInherit' и' cDerived' видимыми в точке, где происходит ошибка? –

ответ

5

В вашем примере вы можете использовать static_cast.

Но вы должны указать оба определения из IInherit и cDerived для его работы. Компилятор должен видеть, что cDerived наследует от IInherit. В противном случае он не может решить, что static_cast действительно действительно.

#include <vector> 

struct R {}; 
struct B {}; 
struct D : public B { 
    R *getR() { return new R(); } 
}; 

void f() 
{ 
    std::vector<B*> v; 
    v.push_back(new D()); 
    D *d = static_cast<D*>(v[0]); 
    R *r = d->getR(); 
} 
+1

Это ответ. static_cast требует больше, чем переднего объявления, чтобы гарантировать, что приведение, по крайней мере, возможно (хотя вы все равно можете лгать компилятору). –

+1

@vaibhavkumar Видимость сама по себе не является проблемой, компилятор должен увидеть определение, то есть наследование. Я обновил свой ответ. –

+0

Я. это работает. Большое спасибо за ваш ответ. –

Смежные вопросы