合格的类成员

Qualified class member

本文关键字:成员      更新时间:2023-10-16

我写了以下代码:

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(){ }

为什么会出现这个错误?你能从《标准》上找到明确否认这种构造的参考吗?

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 static

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

或实例化B中的A成员:

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

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

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

以下是标准的相关文档:

9.3成员函数[class.mfct]

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

错误信息

<>之前//错误:非友类成员'foo'不能有限定名之前

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

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