“必须具有类或枚举类型的参数”实际上意味着什么

时间:2013-06-17 02:00:55

标签: c++

我有一个头文件和一个.cpp文件。我需要为我的.h文件编写函数,但在完全完成骨架.cpp文件之前我得到一个错误。

Money.h

#ifndef MONEY_H
#define MONEY_H

#include <iostream>
#include <iomanip>

using namespace std;

class Money
{
public:
   Money(int dollars, int cents);
   Money operator+(const Money& b) const;
   Money operator-(const Money& b) const;
   Money operator*(double m) const;
   Money operator/(double d) const;

   void print() const;

private:
   int dollars;
   int cents;
};

#endif

Money.cpp

#include "Money.h"

Money::Money(int dollars, int cents){

}
Money operator+(const Money& b) {

}
Money operator-(const Money& b) {

}
Money operator*(double m) {

}
Money operator/(double d) {

}

void print(){

}

错误与乘法和除法运算符有关:

  

Money.cpp:12:25:错误:'Money operator *(double)'必须有   类或枚举类型的参数

     

Money.cpp:15:25:错误:'Money operator /(double)'必须有   类或枚举类型的参数

1 个答案:

答案 0 :(得分:13)

您没有使用范围解析运算符告诉编译器您正在定义成员函数。它被解释为全局运算符重载,它带有两个参数,其中一个必须是类或枚举类型。这基本上意味着您的一个参数必须是用户定义的类型(不是primitive type的类型)或enumerated type,它是通过enum定义的。

在原始代码Money中只是返回类型;它不会告诉编译器您正在从该类定义成员函数。

以下是您的一行修补程序:

Money Money::operator+(const Money& b)                                         /*
      ^^^^^^^                                                                  */
{
     // ...
}

此外,您的原型和定义也必须符合cv资格。您的定义缺少const限定符...

Money Money::operator+(const Money& b) const                                   /*
                                       ^^^^^                                   */
{
     // ...
}

更新

我还发现您对Money::operator*Money::operator/的定义与其原型不符。两者的原型都采用double,而定义采用Money const&。您需要更改一个以匹配另一个。

// inside Money class

Money operator*(Money const&) const;
Money operator/(Money const&) const;