class C1
{
public:
C1* A;
void SomeMethod()
{
class C2;
C2* c2 = dynamic_cast<C2*>(A);
}
};
class C2 : public C1 {};
在gcc中,当调用dynamic_cast时,我得到“target不是指针或对完整类型的引用”。怎么了?
答案 0 :(得分:2)
以下编译:
class C2;
class C1
{
virtual ~C1() { } // <--- NOTE MUST BE polymorphic to use dynamic_cast
public:
C1* A;
void SomeMethod();
};
class C2 : public C1 {};
void C1::SomeMethod()
{
C2* c2 = dynamic_cast<C2*>(A); // <=== USED after C2 definition
}
int main() {
}
两个问题:
答案 1 :(得分:0)
class C2;
C2* c2 = dynamic_cast<C2*>(A);
第一行告诉编译器&#34;有一个类类型&#34; C2&#34;当你找到定义&#34;。
时,它将在后面的编译单元中完全定义如果您尝试将C2实例用作引用或指针声明之外的任何内容(直到需要定义类),您将收到错误,告诉您指针不是完全定义的类型(&# 34;或&#34;用编译语言完成类型&#34;。
修复:
#include <C2.h> // header where "class C2 { ... };" is defined
// no longer necessary: class C2;
C2* c2 = dynamic_cast<C2*>(A); // this should now compile