我有两个相互依赖的类:
class Foo; //forward declaration
template <typename T>
class Bar {
public:
Foo* foo_ptr;
void DoSomething() {
foo_ptr->DoSomething();
}
};
class Foo {
public:
Bar<Foo>* bar_ptr;
void DoSomething() {
bar_ptr->DoSomething();
}
};
当我用g ++编译它时,它给出了“无效使用不完整类型”的错误,但它在MSVC 10中编译得很好。 是否可以在将声明和定义保存在一个头文件中的同时解决此问题? (没有cpp文件) 如果标准中不允许这样,那么这是MSVC“bug”或“feature”中的一个吗?
答案 0 :(得分:8)
是的,只需将方法定义移出类定义:
class Foo; //forward declaration
template <typename T>
class Bar {
public:
Foo* foo_ptr;
void DoSomething();
};
class Foo {
public:
Bar<Foo>* bar_ptr;
void DoSomething() {
bar_ptr->DoSomething();
}
};
// Don't forget to make the function inline or you'll end up
// with multiple definitions
template <typename T>
inline void Bar<T>::DoSomething() {
foo_ptr->DoSomething();
}
答案 1 :(得分:0)
查看此页面: What is the best way to deal with co-dependent classes in C++?
它应该解决问题并提供一些很好的解决方案。
答案 2 :(得分:0)
当您使用模板参数<div id="theDocument" class="DocumentText" style="position: relative; float: left; overflow: scroll; height: 739px;">
<p>PTag</p>
<p> <center> First center </center> </p>
<small> this is small</small>
<p>...</p>
<p> <center> Second Center </center> </p>
<p>....</p>
</div>
替换Foo* foo_ptr;
时,它会生效,以便您获得T
。在此T* foo_ptr;
中,不一定必须是指针或预定义。
foo_ptr