我在一个封闭类中有两个内部结构,在其中一个结构中,我有一个指向另一个结构类型的对象的指针成员。为了提高可读性并明确前向声明是针对需要它的结构的,我将前向声明放在内部结构本身中。像这样的东西
class Enclosing{
public:
struct InnerA{
struct InnerB; // forward declaration inside InnerA to improve readability
InnerB* b;
// other members
};
struct InnerB{
// lots of member variables
};
};
然后在外面的某个地方,我有一个函数
void DoSomething(){
Enclosing::InnerA a;
// error incompatible types Enclosing::InnerB* and Enclosing::InnerA::InnerB*
Enclosing::InnerB* ptr = a.b;
}
据我所知,正向声明只是一种告诉编译器类存在的方式,而不是定义一个完全不同的新类型。这是标准吗?如果是这样的话,有没有办法将正向声明放在结构中,而不被视为不同的类型?
发布于 2019-05-24 07:38:20
是的,它被认为是一种不同的类型。
声明将名称放入声明出现的作用域中。每个类都引入了自己的作用域。因此,在您的示例中,您使用的是与Enclosing::InnerB
明显不同的Enclosing::InnerA::InnerB
。
除了当前的作用域之外,恐怕没有办法在不同的作用域中声明名称。您只需要在Enclosing
中直接声明InnerB
,然后再定义使用它的InnerA
。
发布于 2019-05-24 07:38:53
你的正向声明嵌套了两次,你正向声明了Enclosing::InnerA::InnerB
,但你的定义是针对Enclosing::InnerB
的,所以你实际上是在正向声明一个不同的类型。
你应该保持在相同的级别:
class Enclosing {
struct InnerB;
struct InnerA {
InnerB* ptr;
};
};
问题不在于转发声明本身,它就像你正在做的那样:
class Enclosing {
struct InnerA {
struct InnerB {
int data;
};
InnerB* ptr;
};
struct InnerB {
float data;
};
};
您可以看到,Enclosing::InnerA::InnerB
和Enclosing::InnerB
确实是不同的类型,这是因为声明像普通声明一样保留了它的局部性。
https://stackoverflow.com/questions/56284127
复制相似问题