8

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

钱.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

钱.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)' 必须具有类或枚举类型的参数

4

1 回答 1

17

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

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

这是您的一条线的修复:

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

此外,您的原型和定义还必须在 cv-qualification 中匹配。您的定义缺少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;
于 2013-06-17T02:04:16.727 回答