我有这种课程结构,我不知道,为什么我得到错误。由于错误输出,搜索问题非常困难。
error: cannot convert 'A::C*' to 'C*' in assignment: two = this;
如何解决此错误?
class B;
class C;
class A{
class B{
public:
B* one
C* two;
And some methods....
...
};
class C : public B{
public:
int f;
C(){
two = this; //here is error
}
};
};
答案 0 :(得分:9)
您的示例声明了5个不同的类(完全限定,按顺序):::B
,::C
; ::A
,::A::B
和::A::C
,因为在您的代码中
class B;
class C;
在全局命名空间中声明::B
和::C
,您可能不打算这样做。这导致编译器认为C
中C* two;
字段中的不合格::A::B
引用::C
而不是::A::C
。
而是在class A {}
中声明这些类,如下所示:
class A{
class B; // declares ::A::B
class C; // declares ::A::C
class B{
public:
B* one
C* two; // ::A::C*
And some methods....
...
};
class C : public B{
public:
int f;
C(){
two = this; // should work now
}
};
};
在上面,编译器现在知道C*
你的意思是::A::C*
,因为在搜索C
的匹配类型时,它会在内部遇到class C;
的声明范围class A {};
。但是,它不会“看到”下面声明的::A::C
的实际定义。
非限定名称查找的详细规则可以在C ++标准(draft version)的§3.4.1节中找到。