CLASS_NAME未声明 - 不能dynamic_cast(目标不是指针或对完整类型的引用)

时间:2015-01-08 09:09:23

标签: c++ dynamic-cast

我有以下代码:

#include <iostream>

using namespace std;

class A{

};

class B: public A{
   public:
          void f(A *ptr){
               if(dynamic_cast<C *>(ptr)!=0){            // errors in this line
                   cout<<"ptr is pointing to C object\n";
               } 
          }                 
};

class C: public B{

};

int main(){

  A *aptr = new C();
  B *bptr = new B();
  bptr->f(aptr);

  return 0;
}

当我尝试编译时,我收到错误:

'C' has not been declared.

所以我在class C;的代码上方添加了一个前向声明class B,然后尝试再次编译它,然后它给出了错误:

cannot dynamic_cast 'ptr' (of type 'class A*') to type 'struct C*' (target is not pointer or reference to complete type)

1)为什么在第一个错误中class B在同一个.cpp文件中看不到它的派生class C

2)为什么在第二个错误编译器中说class C不是指向完整类型的指针?

提前致谢。

1 个答案:

答案 0 :(得分:2)

稍后定义B::f()

class B: public A{
public:
      void f(A *ptr);    
};
class C : public B { /* ... */ };

void B::f(A *ptr) {
           if(dynamic_cast<C *>(ptr)!=0){
               cout<<"ptr is pointing to C object\n";
           } 
}

如C ++标准[expr.dynamic.cast]中所述,

  

表达式dynamic_cast<T>(v)的结果是结果   将表达式v转换为T类型。 T应为指针或   引用完整的类类型,或“指向 cv void的指针。”