C++ 默认参数不属于同一类型?

C++ 默认参数不属于同一类型?,c++,parameters,C++,Parameters,我之前发布了一个关于我的构造函数的问题,我以某种方式修复了它。现在,当我试图用userinput声明一个“Rational”类型的对象,而用默认参数声明另一个对象时,我遇到了一个错误。当我尝试使用重载运算符时,它会给我这个错误 error: no match for 'operator+' (operand types are 'Rational()' and 'Rational') Rational xxx = test6+test5; 我的.H文件 #ifndef RATIONAL_H

我之前发布了一个关于我的构造函数的问题,我以某种方式修复了它。现在,当我试图用userinput声明一个“Rational”类型的对象,而用默认参数声明另一个对象时,我遇到了一个错误。当我尝试使用重载运算符时,它会给我这个错误

error: no match for 'operator+' (operand types are 'Rational()' and 'Rational')
  Rational xxx = test6+test5;
我的.H文件

#ifndef RATIONAL_H
#define RATIONAL_H

#include <iostream>
#include <stdexcept>
using namespace std;

class Rational {
   private: 
    int num, denom;
   public:
   /* Set Numerator and Denom */
    Rational(int nu, int deno);
    int gcd(int x, int y);
    Rational operator+(const Rational& other);
    Rational operator-(const Rational& other);
    Rational operator*(const Rational& other);
    Rational operator/(const Rational& other);
    friend ostream &operator<<(ostream& os, const Rational& rat);
    void deci();
};

#endif
我是否应该创建另一个方法,只声明Rational而不在我的cpp中使用括号

Rational test6();
信不信由你,但它被解析为名为
test6
()的函数的声明,该函数返回
Rational
的实例

从那一刻起,事情几乎就分崩离析了

将此更改为:

Rational test6;
附言:实际上,您的操作员过载确实有一个小问题。它应该是:

Rational Rational::operator+(const Rational &other)
信不信由你,但它被解析为名为
test6
()的函数的声明,该函数返回
Rational
的实例

从那一刻起,事情几乎就分崩离析了

将此更改为:

Rational test6;
附言:实际上,您的操作员过载确实有一个小问题。它应该是:

Rational Rational::operator+(const Rational &other)

您的行
rationaltest6()
不是定义一个类型为
Rational
的新变量,而是定义一个名为
test6
的函数,该函数返回
Rational
,不带任何参数。要获得您想要的行为,请删除括号:
rationaltest6


或者,如果您使用的是C++11,我相信您可以使用大括号:
RationalTest6{}

您的代码行
RationalTest6()
不是定义一个类型为
Rational
的新变量,而是定义一个名为
test6
的函数,该函数返回
Rational
,不带任何参数。要获得您想要的行为,请删除括号:
rationaltest6


或者,如果您使用的是C++11,我相信您可以使用大括号:
RationalTest6{}

更新后: 您已经告诉我们您的默认参数是1/1,但您也必须告诉编译器


您需要在现有构造函数上设置默认值,或者提供默认构造函数。

更新后: 您已经告诉我们您的默认参数是1/1,但您也必须告诉编译器


您需要将默认值放在现有构造函数上,或者提供一个默认构造函数。

Rational::Rational(int nu=1,int deno=1){…}这不声明默认参数吗?不。调用该方法的代码无法看到它们,它们位于不同的翻译单元中。将它们放在类定义的声明中。是的,看起来我必须声明一个默认参数。。。我是通过调用另一个没有参数的构造函数方法来实现的,有没有办法把它放在我的构造函数中?
Rational(int nu=1,int deno=1)在类声明中。否。在你的类中,你有
Rational(intnu,intdeno)。这是构造函数的声明。将其更改为
Rational(int nu=1,int deno=1)。然后,当您在没有任何参数(或没有
deno
)的情况下调用它时,调用者将使用这些值(或该值)。(我回复的评论被删除了吗?)Rational::Rational(int nu=1,int deno=1){…}这没有声明默认参数吗?没有。调用该方法的代码无法看到它们,它们位于不同的翻译单元中。将它们放在类定义的声明中。是的,看起来我必须声明一个默认参数。。。我是通过调用另一个没有参数的构造函数方法来实现的,有没有办法把它放在我的构造函数中?
Rational(int nu=1,int deno=1)在类声明中。否。在你的类中,你有
Rational(intnu,intdeno)。这是构造函数的声明。将其更改为
Rational(int nu=1,int deno=1)。然后,当您在没有任何参数(或没有
deno
)的情况下调用它时,调用者将使用这些值(或该值)。(我回复的评论被删除了吗?@BaoThai你没有给
Rational
一个默认构造函数。要么这样做,要么使用
rationaltest6(1,1)用于example@BaoThai您没有给
Rational
一个默认构造函数。要么这样做,要么使用
rationaltest6(1,1)例如
Rational Rational::operator+(const Rational &other)