C++ C++;:如何使用尚未定义的类型?

C++ C++;:如何使用尚未定义的类型?,c++,header,declaration,forward-declaration,C++,Header,Declaration,Forward Declaration,C++要求所有类型在使用之前都必须定义,这使得以正确的顺序包含头文件非常重要。好的但我的情况如何: Bunny.h: class Bunny { ... private: Reference<Bunny> parent; } 编辑:这很好,问题出在其他方面。非常感谢你的帮助 如果Reference具有T类型的变量,则T不能具有Reference类型的变量。您可以选择重写Reference,或者重写Bunny以使用指向Reference的指

C++要求所有类型在使用之前都必须定义,这使得以正确的顺序包含头文件非常重要。好的但我的情况如何:

Bunny.h

class Bunny { ... private: Reference<Bunny> parent; } 编辑:这很好,问题出在其他方面。非常感谢你的帮助

如果
Reference
具有
T
类型的变量,则
T
不能具有
Reference
类型的变量。您可以选择重写
Reference
,或者重写
Bunny
以使用指向
Reference
的指针:

模板类参考;
班兔
{
...
私人:
参考*父母;
}

问题的答案取决于引用的外观。如果它有一个类型为Bunny的实例变量,那么它当然不会工作(怎么会呢,你有一个永远不会结束的递归定义)。如果它只有引用和指针,那么它应该可以正常工作。模板实例化中的Bunny类型不会对此产生干扰

编辑(后参考代码编辑):

我似乎无法重现你的问题。我已经像您正在做的那样重新实现了代码,但它对我来说编译得很好:

struct base {
  void fun() {}
};
template < typename T >
struct temp
{
  T * t;

  void f() { ((base*)t)->fun(); }
};

struct test
{
  temp<test> t;

};

int main()
{
  test t;
  t.t.f();
}
struct base{
void fun(){}
};
模板
结构温度
{
T*T;
void f(){((base*)t)->fun();}
};
结构测试
{
温度t;
};
int main()
{
试验t;
t、 t.f();
}

这显然是无效的代码,因为您将获得未定义的结果,但它确实可以编译。这里的主要问题是从类型测试*到类型基*的重新解释转换。如果测试真的从基础继承,那么演员阵容就没有必要了。像这样的代码不会像预期的那样工作,但它应该编译得很好。我的一个建议是丢掉所有的c风格演员。但这并不能解决您遇到的问题,不管它是什么……它必须在您不粘贴的代码中的某个地方。

这不只是一个抽象的问题吗,抽象成为问题的解决方案?我会考虑创建一个接口,<代码> iBunn,然后在实现<代码> iBunny/Cult>的任何定义中使用<代码>引用< /代码>。p>
这是为接口而发明的用例之一(在典型的GoF创作模式中很方便)。

你能发布你的参考类吗?是的。它本质上是一个智能指针。对于我来说,它在VS2008中编译得很好。编译器输出是什么?不需要。正如@Noah所说,他有一个递归定义。谢谢!这是另外一回事,我做出了错误的假设。
template<class> class Reference;

class Bunny
{
    ...
private:
    Reference<Bunny>* parent;
}
struct base {
  void fun() {}
};
template < typename T >
struct temp
{
  T * t;

  void f() { ((base*)t)->fun(); }
};

struct test
{
  temp<test> t;

};

int main()
{
  test t;
  t.t.f();
}