错误:在先前的规范之后为参数指定的默认参数

时间:2012-11-08 18:37:15

标签: c++ default-arguments

对我来说非常简单的任务,我不知道为什么这会给我带来问题,我只是简单地让两个模型类尝试在他们的方法中没有任何逻辑的情况下编译,使用已经给我的头文件和声明。老实说,这只是一个剪切和粘贴工作,但我仍然遇到了这个金色的金块 -

cbutton.cpp:11:44: error: default argument given for parameter 4 of ‘cio::CButton::CButton(const char*, int, int, bool, const char*)’ [-fpermissive]
cbutton.h:7:5: error: after previous specification in ‘cio::CButton::CButton(const char*, int, int, bool, const char*)’ [-fpermissive]
cbutton.cpp:11:44: error: default argument given for parameter 5 of ‘cio::CButton::CButton(const char*, int, int, bool, const char*)’ [-fpermissive]
cbutton.h:7:5: error: after previous specification in ‘cio::CButton::CButton(const char*, int, int, bool, const char*)’ [-fpermissive]
cbutton.cpp:19:41: error: default argument given for parameter 1 of ‘void cio::CButton::draw(int)’ [-fpermissive]
cbutton.h:11:10: error: after previous specification in ‘virtual void cio::CButton::draw(int)’ [-fpermissive]
cbutton.cpp:53:29: error: ‘virtual’ outside class declaration

以下是我正在使用的文件。谢谢大家,一如既往!

#include "cfield.h"

namespace cio{
  class  CButton: public CField{

  public:
    CButton(const char *Str, int Row, int Col, 
            bool Bordered = true,
            const char* Border=C_BORDER_CHARS);
    virtual ~CButton();
    void draw(int rn=C_FULL_FRAME);
    int edit();
    bool editable()const;
    void set(const void* str);
  };
}    




#include "cbutton.h"

namespace cio {  

  CButton::CButton(const char *Str, int Row, int Col, 
          bool Bordered = true,
          const char* Border=C_BORDER_CHARS){

  }

  void CButton::draw(int rn=C_FULL_FRAME){

  }

  int CButton::edit(){

    return 0;
  }

  bool CButton::editable()const {

  return false;
  }

  void CButton::set(const void* str){

  }

  virtual CButton::~CButton(){

  }
}

3 个答案:

答案 0 :(得分:13)

您在函数的定义中指定了一个默认参数,而它们在类声明中已经有一个默认参数。 您可以在类声明或函数定义中声明默认参数,但不能同时声明两者。

编辑:错过了错误的结束:error: ‘virtual’ outside class declaration。这是一个相当清晰的编译器错误:virtual关键字属于类声明,而不是函数定义。只需将其从析构函数的定义中删除即可。

更正来源:

namespace cio {  

  CButton::CButton(const char *Str, int Row, int Col, 
          bool Bordered, // No default parameter here,
          const char* Border){ // here,

  }

  void CButton::draw(int rn){ // and here

  }

  CButton::~CButton(){ // No virtual keyword here

  }
}

答案 1 :(得分:1)

您不在函数定义中包含默认参数,原型是您需要包含默认值的唯一原型。

#include "cbutton.h"

namespace cio {  

  CButton::CButton(const char *Str, int Row, int Col, 
          bool Bordered,
          const char* Border){ //remove in def

  }

  void CButton::draw(int rn){

  }

答案 2 :(得分:0)

定义函数时,不允许重复默认参数。它们只属于声明。 (实际的规则并不那么简单,因为定义也可以是一个定义,但你明白了......)