C ++嵌套类转发声明错误

时间:2008-11-21 23:39:34

标签: c++ class nested declaration forward

我试图在A类中声明并使用B类 并在A外面定义B. 我知道这是可能的,因为Bjarne Stroustrup
在他的“C ++编程语言”一书中使用了这个 (第293页,例如String和Srep类)。

所以这是导致问题的最小代码

class A{
struct B; // forward declaration
B* c;
A() { c->i; }
};

struct A::B { 
/* 
 * we define struct B like this becuase it
 * was first declared in the namespace A
 */
int i;
};

int main() {
}

此代码在g ++中提供以下编译错误:

tst.cpp: In constructor ‘A::A()’:
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’
tst.cpp:3: error: forward declaration of ‘struct A::B’

我试着查看C ++ Faq,我得到的密集是herehere但是
那些不适用于我的情况。
我也是read this来自这里,但它没有解决我的问题。

gcc和MSVC 2005都会在此

上出现编译错误

4 个答案:

答案 0 :(得分:15)

表达式c->i取消引用指向struct A::B的指针,因此程序中此时必须显示完整定义。

最简单的解决方法是使A的构造函数非内联,并在struct A::B定义后为其提供正文。

答案 1 :(得分:11)

在结构B的定义之后定义A的构造函数。

答案 2 :(得分:7)

这是一个很好的例子,说明为什么要将定义与声明分开。您需要更改事物的顺序,以便在A::A()的定义之后定义构造函数struct A::B

class A
{
    struct B;
    B* c;
    A();
};

struct A::B
{
    int i;
};

A::A() { c->i; }

int main()
{
    return 0;
}

答案 3 :(得分:1)

有趣的是,我在Stroustrup一书中提到的第293页('11 .12字符串类')遇到了同样的问题。

印刷书中提供的示例似乎有问题,提供以下方法作为内联,而不是在struct Srep定义之后定义它们

class String {
  // ...
  void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); }
  char read(int i) const { return rep->s[i]; }
  void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; }
  ...etc...

我google了一下,发现了作者最新的String Class实现,可以在这里找到:   http://www2.research.att.com/~bs/string_example.c

他似乎修改了它,以便这些方法不再内联,以避免此线程中提到的问题。