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

use*_*764 6 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
Run Code Online (Sandbox Code Playgroud)

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(){

}
Run Code Online (Sandbox Code Playgroud)

乘法和除法运算符的错误是:

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

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

0x4*_*2D2 14

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

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

以下是您的一行修复:

Money Money::operator+(const Money& b)                                         /*
      ^^^^^^^                                                                  */
{
     // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Money Money::operator+(const Money& b) const                                   /*
                                       ^^^^^                                   */
{
     // ...
}
Run Code Online (Sandbox Code Playgroud)

更新:

我还发现你的定义Money::operator*Money::operator/它们的原型不匹配.两者的原型需要一段double时间定义Money const&.您需要更改一个以匹配另一个.

// inside Money class

Money operator*(Money const&) const;
Money operator/(Money const&) const;
Run Code Online (Sandbox Code Playgroud)