C++ 要求在使用前定义所有类型,因此以正确的顺序包含头文件非常重要。美好的。但是我的情况呢:
Bunny.h
:
class Bunny { ... private: Reference<Bunny> parent; }
编译器提示,因为技术上 因为我做了一些愚蠢的事情(无关)。Bunny
在我用它自己的类定义时还没有完全定义。
除了重写我的模板类 Reference
使其采用指针类型(在这种情况下我可以使用 Bunny
的前向声明),我不知道怎么解决。
有什么建议吗?
编辑:我的Reference
类(XObject
是数据模式对象的基类):
template <class T = XObject> class Reference { public: Reference() : m_ptr (NULL) {} Reference(T* p) { m_ptr = p; if (p != NULL) ((XObject*)p)->ref(); } ~Reference() { if (m_ptr) { ((XObject*)m_ptr)->deref(); } } // ... assignment, comparison, etc. private: T* m_ptr; };
编辑:这工作正常,问题出在其他地方。非常感谢您的帮助!
最佳答案
您问题的答案取决于 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();
}
这显然是无效代码,因为您将得到未定义的结果,但它确实可以编译。这里的主要问题是从类型 test* 到类型 base* 的重新解释转换。如果 test 确实从 base 继承,那么甚至不需要强制转换。像这样的代码不会按预期运行,但应该可以正常编译。我的一个建议是放弃所有 c 风格的转换。这不会解决您遇到的问题,无论它是什么......它必须位于您未粘贴的代码中的某个位置。
关于C++:如何使用尚未定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968915/