我有一个头文件和一个.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)'必须有 类或枚举类型的参数
答案 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;