合格的类成员
Qualified class member
我写了以下代码:
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();
};
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 我们可以访问一个不存在的联盟的成员吗