在g ++上使用不完整类型无效

时间:2010-02-17 01:09:45

标签: c++ class g++

我有两个相互依赖的类:

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”中的一个吗?

3 个答案:

答案 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