合格的班级成员

时间:2014-06-21 19:18:37

标签: c++ class language-lawyer

我写了以下代码:

class A
{
public:
    int foo();
};

class B
{
public:
    int A::foo(){ return 0; }; //error: non-friend class member 'foo' cannot have a qualified name
};

int main(){ }

为什么会出现此错误?你能从标准中得到明确否定该构造的参考吗?

2 个答案:

答案 0 :(得分:4)

int A::foo(){ return 0; };
  

为什么会导致此错误?

因为这对C ++没有任何意义。这不是有效的建筑。与此相关的是

C ++标准版n3337 § 9.3段会员功能

  

2)   可以在其类定义中定义成员函数(8.4)   在哪种情况下,它是内联成员函数(7.1.2),或者它可能是   如果已经定义,则在其类定义之外定义   声明但未在其类定义中定义。会员功能   出现在类定义之外的定义   在包含类定义的命名空间范围内。会员除外   出现在类定义之外的函数定义   除了类的成员函数的显式特化   模板和成员函数模板(14.7)出现在   类定义,成员函数不得重新声明。

     

3)   一个   内联成员函数(无论是静态还是非静态)也可以   在其类定义之外定义提供它的   类定义中的声明或其定义之外的   类定义将函数声明为内联。 [注:会员   命名空间范围内的类的函数具有外部链接。会员   本地类(9.8)的函数没有链接。见3.5。 - 结束说明   ]

     

4)非内联成员最多应有一个定义   在程序中起作用;无需诊断。可能会有更多   程序中的一个内联成员函数定义。见3.2和   7.1.2。

你应该问问自己这应该是什么?你想达到什么目的?如果您的意图是覆盖它,您可以这样做:

class A
{
public:
    virtual int foo() { return 3;}
};

class B : public A
{
public:
    int foo() override { return 0; }
};

如果你想在B中使用A :: foo,那么使A :: foo静态

class A
{
public:
    static int foo() { return 3;}
};

class B
{
public:
    int bar()
    {
        int u = A::foo();
        return u + 8 - 2;
    }
};

或实例化B中的成员:

class A
{
public:
    int foo() { return 3;}
};

class B
{
    A a;
public:
    int bar()
    {
        int u = a.foo();
        return u + 8 - 2;
    }
};

答案 1 :(得分:2)

该行

int A::foo(){ return 0; }

定义foo的成员函数A。在类B的定义下定义它是不合法的。 A::foo()只能在A定义的正文中定义,或者在A定义的名称空间中定义。

以下是标准中的相关文档:

  

9.3成员函数[class.mfct]

     

成员函数可以在其类定义中定义(8.4),在这种情况下,它是内联成员函数(7.1.2),或者如果已经声明了它,则可以在其类定义之外定义它在其类定义中定义。出现在类定义之外的成员函数定义应出现在包含类定义的命名空间范围内。除了出现在类定义之外的成员函数定义,并且类模板和成员函数模板(14.7)的成员函数的显式特化除了出现在类定义之外之外,不应重新声明成员函数。

错误消息

//error: non-friend class member 'foo' cannot have a qualified name

由编译器生成,希望您可能希望使用:

class B
{
public:
    friend int A::foo();
};