【问题标题】:Operator function, comparing two datatypes运算符函数,比较两种数据类型
【发布时间】:2021-12-29 13:39:16
【问题描述】:

我想创建一个运算符函数,它接受一个整数和一个双精度作为参数,如果整数小于双精度则返回 true,否则返回 false。 我来自一门名为 Ada 的编程语言,此类任务将以这种方式执行,但与 C++ 似乎不一样。

是否可以在 C++ 中执行此操作,如果可以,我的代码到底有什么问题?

这是我得到的错误:

12 | bool operator <(int const lhs,
      |      ^~~~~~~~

这是我的代码:

#include <iostream>

using namespace std;

bool operator <(int const lhs,
                double const rhs)
{
    if (double(lhs) < rhs)
    {
    return true;
    }
    
return false;

}

int main()
{
    int lhs {};
    double rhs {};
 
    
    cin >> lhs >> rhs;
    
      
    if (!rhs < lhs)
    {
        cout << "False";
    }
    
}

在我的主程序中,如果rhs &lt; lhs = false,我尝试输出“False”

【问题讨论】:

  • cin &gt;&gt; lhs &gt;&gt; rhs; ?
  • 在 C++ 中,运算符函数的重载要求至少有一个参数是用户定义的类型。不可能用两个参数作为基本类型重载二元运算符函数(如intfloat 等)。这样做的设计原理是防止语言是可变的(例如,不可能改变比较 floatint 与语言内置的含义,所以[说]表达式@987654329如果a &gt; b),@ 给出一个真实的结果。
  • cin &gt;&gt; lhs &gt; rhs; 被解释为(cin&gt;&gt;lhs) &gt; rhs; 并且由于&gt;&gt; 运算符引用std::istreamint 返回对std::istream 的引用,因此以下代码将产生相同的结果:std::cin &gt;&gt; lhs; std::cin &gt; rhs; 但正如编译器告诉你的那样,这里没有适用的&gt; 运算符...
  • 这是我的一个错字。我更新了我的问题并更新了我的错误消息。我只收到一条错误消息,它没有给我很多信息...
  • 由于这两个参数都不是用户定义的类型,所以您不能执行operator&lt;,您需要编写自己的bool is_less(int const lhs, double const rhs) 函数。您是否打算使用 (double, int) 调用采用 (int, double) 的函数?编译器将进行隐式转换。来自 Ada,你可能会发现 C++ 有点像狂野的西部。

标签: c++ operator-overloading


【解决方案1】:

假设您的意思是lhs &lt; rhs,而不是rhs &lt; lhs,您需要提供一个用于较少比较的函数,而不是尝试使用非用户定义的类型重载operator&lt;

#include <iostream>

using std::cin;
using std::cout;

// Thwart implicit conversion.
template <typename T, typename T2>
bool is_less(T const, T2 const) = delete;

template <>
bool is_less(int const lhs,
             double const rhs)
{
    if (double(lhs) < rhs)
    {
        return true;
    }

    return false;
}

int main()
{
    int lhs {};
    double rhs {};

    cin >> lhs >> rhs;

    // Note: changed (rhs, lhs) to (lhs, rhs).
    if (!is_less(lhs, rhs))
    {
        cout << "False\n";
    }
}

【讨论】:

    【解决方案2】:

    您可以重载用户定义类型的运算符,例如类或枚举。

    至于这个说法

    cin >> lhs > rhs;
    

    那么由于运算符的优先级,它等价于

    ( cin >> lhs ) > rhs;
    

    所以实际上你正在尝试将 std::istream 类型的对象与 double 类型的对象进行比较。但是没有定义这样的运算符。

    似乎也是if语句的条件

    if (!rhs < lhs)
    

    有错别字。

    也许你的意思

    if (!( rhs < lhs ) )
    

    【讨论】:

    • 这是我的一个错字。我更新了我的问题并更新了我的错误消息。我只收到一条错误消息,它没有给我很多信息...
    • @MohamedAlkalam 没关系。我已经回答了你的问题,你可能不会为非用户定义的类型重载运算符。
    • 但是我将函数中的整数转换为双精度数,所以在这种情况下,我将双精度数与双精度数进行比较。
    • 即使我比较整数也行不通。
    • @MohamedAlkalam 您不得重载非用户定义类型的运算符。什么不清楚?
    猜你喜欢
    • 2010-12-16
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多