无法将公共嵌套类用作私有方法参数。

14
在下面的代码中:
class Outer {
   private:
    void f_private(Outer::Inner in); // Wrong

   public:
    class Inner {};
    void f_public(Outer::Inner in); // OK
};

f_private()无法使用嵌套类Outer::Inner作为参数类型。但在f_public()中这样做是可以的。

有人能解释一下这个规则基于什么,以及它的好处是什么吗?

1个回答

31

问题不在于公开还是私有,而在于顺序。这似乎很奇怪,在其他类成员中这不是问题,但请考虑在这种情况下您正在声明一个新的用户定义类型,因此您必须在使用它之前进行声明:

class Outer 
{
public:
    class Inner {};   
    void f_public(Outer::Inner in);  // OK

private:
    void f_private(Outer::Inner in); // OK
};

或者:

class Outer
{
public:
    class Inner;                          // declare
    void f_public(Outer::Inner in);       // OK

private:
    void f_private(Outer::Inner in);       // OK
};

class Outer::Inner {};                     // define

void Outer::f_private(Outer::Inner in){}   // method definition after class definition

void Outer::f_public(Outer::Inner in){}    //

如果您将类用作指针或引用参数,则无需在之前定义它,前向声明即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接