带有尾随返回类型的 final、override、const 的语法

pss*_*pss 5 c++ syntax c++11

我试图覆盖一个 virtual 但也使用关键字override, finaland const,带有尾随返回类型。问题似乎出在派生类上,编译器错误(说我没有指定尾随返回类型)并没有太大帮助。代码在这里:https : //wandbox.org/permlink/zh3hD4Ukgrg6txyE

还贴在下面。我玩过不同的排序,但似乎仍然无法正确。任何帮助将不胜感激,谢谢。

#include<iostream>
using std::cout; using std::endl; using std::ostream;
//////////////////////////////////////////////
//Base stuff
class Base
{
public:
  Base(int i=2):bval(i){}
  virtual ~Base()=default;
  virtual auto debug(ostream& os=cout)const->ostream&;

private:
  int bval=0;
};

auto Base::debug(ostream& os) const->ostream&
{
  os << "bval: " << bval << endl;
  return os;
}

///////////////////////////////////////////////
//Derived stuff
class Derived : public Base
{
public:
  Derived(int i=2,int j=3):Base(i), dval(j){}
  ~Derived()=default;

  auto debug(ostream& os=cout) const override final->ostream&; // error here

private:
  int dval=0;
};

auto Derived::debug(ostream& os) const override final->ostream&
{
  os << "dval: " << dval << endl;
  return os;
}

///////////////////////////////////////////////
//Testing!
int main()
{
  Base b(42);
  b.debug()<<endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 6

正确的语法应该是:

  1. overridefinal应该出现在成员函数声明之后,包括尾随返回类型规范,即

    auto debug(ostream& os=cout) const ->ostream& override final;
    
    Run Code Online (Sandbox Code Playgroud)
  2. override并且final不应与类定义之外的成员函数定义一起使用,因此只需删除它们:

    auto Derived::debug(ostream& os) const ->ostream&
    {
      os << "dval: " << dval << endl;
      return os;
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • @pss _什么可以同时出现在声明和定义中_——我的经验法则:如果你可以重载某些东西,它必须同时出现在声明和定义中。 (2认同)
  • @pss 尾随返回类型规范是函数声明的一部分(即函数签名的一部分),但 `final` 和 `override` 不是。所以你不应该把它们放在函数声明的中间。作为函数签名的一部分,可以(并且应该)为声明和定义指定尾随返回类型规范,但“final”和“override”只能在类定义中指定;它们用于一些与类和继承相关的特性,但不用于实现。 (2认同)