函数定义上的纯说明符

问题描述 投票:34回答:6

在GCC上编译时,我得到错误:函数定义上的纯说明符,但是当我使用VS2005编译同一代码时却没有。

class Dummy {   
  //error: pure-specifier on function-definition, VS2005 compiles 
  virtual void Process() = 0 {};
};

但是当此纯虚函数的定义不是内联时,它将起作用:

class Dummy
{
  virtual void Process() = 0;
};
void Dummy::Process()
{} //compiles on both GCC and VS2005

错误是什么意思?为什么我不能内联?逃避第二个代码示例中所示的编译问题是否合法?

c++ abstract-class pure-virtual
6个回答
31
投票

好吧,我刚刚学到了一些东西。纯虚函数必须声明如下:


class Abstract 
{
public:
   virtual void pure_virtual() = 0;
};

它可能有一个尸体,尽管在声明时将其包括在内是非法的。这意味着要具有主体,必须在类外部定义纯虚函数。请注意,即使它具有主体,该函数仍必须被从Abstract派生的任何具体类覆盖。如果需要,他们可以选择显式调用Abstract::pure_virtual()

详细信息是here


19
投票

C ++标准,10.4 / 2:

函数声明不能​​同时提供纯说明符和定义


12
投票

此语法:

virtual void Process() = 0 {};

不是合法的C ++,但VC ++支持。确切为什么标准不允许这样做对我来说从来都不是显而易见的。您的第二个例子是合法的。


4
投票

根据定义,纯虚拟函数在C ++中没有定义在声明中

您的第二个代码块无法避免编译器问题。它正在按预期的方式实现纯虚函数。

要问的问题是,如果要使用默认实现,为什么需要将其声明为纯虚拟的?


3
投票

这在语法上是不允许的-可以包含pure-specifiers的声明符,即<< [member-declarator仅出现在不是定义的声明中。 [class.mem]:

成员声明

optdecl-specifier-seq opt member-declarator-list opt;[function-definition][...]member-declarator-list:<< [member-declarator

成员声明者列表,成员声明者

member-declarator:<< opt

pure-specifier

opt声明符大括号或等于初始化器 optidentifier opt attribute-specifier-seq opt:constant-expressionfunction-definition的语法不包括pure-specifier,[dcl.fct.def.general]:

function-definition

:<< [attribute-specifier-seq
optdecl-specifier-seq
opt

declarator virt-specifier-seq

opt function-body
© www.soinside.com 2019 - 2024. All rights reserved.