重载 'operator++' 必须是一元或二元运算符(有 3 个参数)
Overloaded 'operator++' must be a unary or binary operator (has 3 parameters)
我有一个头文件和一个 .cpp 文件。我正在尝试实现前缀和 postfix 运算符重载,但在设置重载时我一直收到此错误。
fraction.h
#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;
class Fraction
{
public:
Fraction();
Fraction(int, int);
int getTop() {return m_top;}
int getBottom() {return m_bottom;}
void set(int t, int b) {m_top=t; m_bottom=b; reduce();
}
protected:
private:
void reduce();
int gcf(int, int);
int m_top;
int m_bottom;
};
Fraction& operator ++ (Fraction);
Fraction operator++(Fraction, int);
#endif
Main.cpp
#include <iostream>
using namespace std;
#include "fraction.h"
int main {
cout << "The fraction is" << f;
cout << "The output of ++f is " << (++f) << endl;
cout << "The fraction is" << f;
cout << "The output of f++ is " << (f++) << endl;
cout << "The fraction is" << f;
return 0;
}
Fraction& Fraction::operator ++ (Fraction){
// Increment prefix
m_top += m_bottom;
return *this;
}
Fraction Fraction::operator ++ (Fraction, int){
//Increment postfix
}
这是我得到的两个错误:
prefix error: "Parameter of overloaded post-increment operator must have type 'int' (not 'Fraction')"
postfix error: "Overloaded 'Operator++' must be a unary or binary operator (has 3 parameters)"
前缀错误实际上是我的 ide 的错误吗?我知道 post 增量必须是 'int',但我正在尝试进行预增量。我使用 xcode。
您将函数声明为自由函数
Fraction& operator ++ (Fraction);
Fraction operator++(Fraction, int);
但您将它们定义为成员函数。
Fraction& Fraction::operator ++ (Fraction){ ... }
Fraction& Fraction::operator ++ (Fraction, int){ ... }
由于成员函数有一个隐含的 this
参数,您的成员函数有三个参数(this
、Fraction
和 int
)。
决定您希望这些功能是免费的还是会员制的。如果您希望它们是免费的,则将它们定义为免费而不是会员。如果您希望他们成为成员,则将他们声明为成员并按照上面@crayzeewulf 的说明调整声明。
成员函数有一个隐含的 *this 指针,它总是指向成员函数正在处理的 class 对象。我们必须在友元函数版本中显式列出的参数(没有 *this 指针)在成员函数版本中变为隐式 *this 参数。
尝试让它成为非成员function.Then你可以传递参数
否则删除参数。
您将 class 之外的运算符声明为非 class 函数
Fraction& operator ++ (Fraction);
Fraction operator++(Fraction, int);
然而你正试图将它们定义为 class 成员函数
Fraction& Fraction::operator ++ (Fraction){
// Increment prefix
m_top += m_bottom;
return *this;
}
Fraction Fraction::operator ++ (Fraction, int){
//Increment postfix
}
要么通过以下方式将它们声明为class成员函数
class Fraction
{
public:
Fraction & operator ++();
Fraction operator ++( int );
//...
在这种情况下,预增量运算符的定义可以类似于
Fraction & Fraction::operator ++(){
// Increment prefix
m_top += m_bottom;
return *this;
}
或者将它们声明为 class 的友元的非 class 函数,因为它们需要访问 class
的私有数据成员
class Fraction
{
public:
friend Fraction & operator ++( Fraction & );
friend Fraction operator ++( Fraction &, int );
//...
在这种情况下,预增量运算符的定义可以类似于
Fraction & operator ++( Fraction &f ){
// Increment prefix
f.m_top += f.m_bottom;
return f;
}
int main() {
Fraction f;
cout << "The fraction is" << f;
cout << "The output of ++f is " << (++f) << endl;
cout << "The fraction is" << f;
cout << "The output of f++ is " << (f++) << endl;
cout << "The fraction is" << f;
return 0;
}
Fraction& Fraction::operator++ ()
{
// Increment prefix
m_top += 1;
return *this;
}
const Fraction Fraction::operator++ (int)
{
//Increment postfix
Fraction temp = *this;
++(*this);
return temp;
}
ostream& operator<<(ostream &os, const Fraction& f)
{
os << f.m_top << endl;
return os;
}
Fraction::Fraction(const Fraction& f)
{
m_top = f.m_top;
m_bottom = f.m_bottom;
}
Fraction::Fraction(int t, int b) :m_top(t), m_bottom(b){}
Fraction::Fraction() : m_top(1), m_bottom(1){}
class Fraction
{
public:
Fraction();
Fraction(int, int);
Fraction(const Fraction& f);
int getTop() { return m_top; }
int getBottom() { return m_bottom; }
void set(int t, int b) {
m_top = t; m_bottom = b; reduce();
}
Fraction& operator ++ ();
const Fraction operator++(int);
friend ostream& operator<<(ostream &os,const Fraction& f);
protected:
private:
void reduce();
int gcf(int, int);
int m_top;
int m_bottom;
};
#endif
我有一个头文件和一个 .cpp 文件。我正在尝试实现前缀和 postfix 运算符重载,但在设置重载时我一直收到此错误。
fraction.h
#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;
class Fraction
{
public:
Fraction();
Fraction(int, int);
int getTop() {return m_top;}
int getBottom() {return m_bottom;}
void set(int t, int b) {m_top=t; m_bottom=b; reduce();
}
protected:
private:
void reduce();
int gcf(int, int);
int m_top;
int m_bottom;
};
Fraction& operator ++ (Fraction);
Fraction operator++(Fraction, int);
#endif
Main.cpp
#include <iostream>
using namespace std;
#include "fraction.h"
int main {
cout << "The fraction is" << f;
cout << "The output of ++f is " << (++f) << endl;
cout << "The fraction is" << f;
cout << "The output of f++ is " << (f++) << endl;
cout << "The fraction is" << f;
return 0;
}
Fraction& Fraction::operator ++ (Fraction){
// Increment prefix
m_top += m_bottom;
return *this;
}
Fraction Fraction::operator ++ (Fraction, int){
//Increment postfix
}
这是我得到的两个错误:
prefix error: "Parameter of overloaded post-increment operator must have type 'int' (not 'Fraction')"
postfix error: "Overloaded 'Operator++' must be a unary or binary operator (has 3 parameters)"
前缀错误实际上是我的 ide 的错误吗?我知道 post 增量必须是 'int',但我正在尝试进行预增量。我使用 xcode。
您将函数声明为自由函数
Fraction& operator ++ (Fraction);
Fraction operator++(Fraction, int);
但您将它们定义为成员函数。
Fraction& Fraction::operator ++ (Fraction){ ... }
Fraction& Fraction::operator ++ (Fraction, int){ ... }
由于成员函数有一个隐含的 this
参数,您的成员函数有三个参数(this
、Fraction
和 int
)。
决定您希望这些功能是免费的还是会员制的。如果您希望它们是免费的,则将它们定义为免费而不是会员。如果您希望他们成为成员,则将他们声明为成员并按照上面@crayzeewulf 的说明调整声明。
成员函数有一个隐含的 *this 指针,它总是指向成员函数正在处理的 class 对象。我们必须在友元函数版本中显式列出的参数(没有 *this 指针)在成员函数版本中变为隐式 *this 参数。
尝试让它成为非成员function.Then你可以传递参数 否则删除参数。
您将 class 之外的运算符声明为非 class 函数
Fraction& operator ++ (Fraction);
Fraction operator++(Fraction, int);
然而你正试图将它们定义为 class 成员函数
Fraction& Fraction::operator ++ (Fraction){
// Increment prefix
m_top += m_bottom;
return *this;
}
Fraction Fraction::operator ++ (Fraction, int){
//Increment postfix
}
要么通过以下方式将它们声明为class成员函数
class Fraction
{
public:
Fraction & operator ++();
Fraction operator ++( int );
//...
在这种情况下,预增量运算符的定义可以类似于
Fraction & Fraction::operator ++(){
// Increment prefix
m_top += m_bottom;
return *this;
}
或者将它们声明为 class 的友元的非 class 函数,因为它们需要访问 class
的私有数据成员class Fraction
{
public:
friend Fraction & operator ++( Fraction & );
friend Fraction operator ++( Fraction &, int );
//...
在这种情况下,预增量运算符的定义可以类似于
Fraction & operator ++( Fraction &f ){
// Increment prefix
f.m_top += f.m_bottom;
return f;
}
int main() {
Fraction f;
cout << "The fraction is" << f;
cout << "The output of ++f is " << (++f) << endl;
cout << "The fraction is" << f;
cout << "The output of f++ is " << (f++) << endl;
cout << "The fraction is" << f;
return 0;
}
Fraction& Fraction::operator++ ()
{
// Increment prefix
m_top += 1;
return *this;
}
const Fraction Fraction::operator++ (int)
{
//Increment postfix
Fraction temp = *this;
++(*this);
return temp;
}
ostream& operator<<(ostream &os, const Fraction& f)
{
os << f.m_top << endl;
return os;
}
Fraction::Fraction(const Fraction& f)
{
m_top = f.m_top;
m_bottom = f.m_bottom;
}
Fraction::Fraction(int t, int b) :m_top(t), m_bottom(b){}
Fraction::Fraction() : m_top(1), m_bottom(1){}
class Fraction
{
public:
Fraction();
Fraction(int, int);
Fraction(const Fraction& f);
int getTop() { return m_top; }
int getBottom() { return m_bottom; }
void set(int t, int b) {
m_top = t; m_bottom = b; reduce();
}
Fraction& operator ++ ();
const Fraction operator++(int);
friend ostream& operator<<(ostream &os,const Fraction& f);
protected:
private:
void reduce();
int gcf(int, int);
int m_top;
int m_bottom;
};
#endif