C++ C++;为什么我的交换函数没有被调用?

C++ C++;为什么我的交换函数没有被调用?,c++,C++,概述:我正在尝试按距离对这些数组对象进行排序,然后按从最短到最长的顺序打印到控制台的距离。我使用Leg类将字符串存储为字符指针,将距离存储为双精度。我重载了

概述:我正在尝试按距离对这些数组对象进行排序,然后按从最短到最长的顺序打印到控制台的距离。我使用Leg类将字符串存储为字符指针,将距离存储为双精度。我重载了<操作符,但是我有一个排序使用了交换,但是我的构建失败了。这是我第一次使用重载操作符,所以我对它的工作原理还是个新手。我觉得我走的方向是对的。如有任何反馈,将不胜感激。 代码如下:

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdlib>
using namespace std;

class Leg {
    
    const char* const startingCity;
    const char* const endingCity;
    const double distance;
    
public:
    Leg(const char* const, const char* const, const double);
    bool operator<(const Leg&); //for swap
    double getDistance() const {return distance;};
    void output(ostream&) const;
};

int main () {
    
    Leg a[] =
    {
        Leg("Antioch", "Brentwood", 6.9),
        Leg("Pittsburg", "Elk Grove", 40.1),
        Leg("Benicia", "Martinez", 2.9),
        Leg("Napa", "Fairfield", 13.3),
        Leg("Brentwood", "Novato", 48.3),
        Leg("Fremont", "Concord", 29.8),
        Leg("San Pablo", "San Rafael", 11.8),
        Leg("Walnut Creek", "Dixon", 39.7),
        Leg("Santa Rosa", "Napa", 26.4),
        Leg("Daly City", "Alameda", 20.2),
        Leg("San Leandro", "Dublin", 20.3),
        Leg("Modesto", "Antioch", 52.5),
        Leg("Pleasanton", "San Ramon", 10.6),
        Leg("Lafayette", "Livermore", 25.4),
        Leg("Vacaville", "San Francisco", 77.2),
        Leg("Hayward", "Danville", 11.9),
        Leg("Berkeley", "Richmond", 10.1),
        Leg("Oakland", "Oakley", 33.3),
        Leg("Lodi", "Mountain View", 66.2),
        Leg("Antioch", "San Jose", 76.9),
        Leg("Milpitas", "Pacifica", 54.9),
        Leg("Burlingame", "Petaluma", 73.8),
        Leg("Redwood City", "San Bruno", 19.2),
        Leg("San Mateo", "Brentwood", 42.6),
        Leg("Union City", "Ripon", 83.0 ),
        Leg("Sunnyvale", "Tracy", 41.7),
        Leg("Rohnert Park", "Benicia", 36.9),
        Leg("Foster City", "Pittsburg", 6.9),
        Leg("Danville", "Manteca", 43.2),
        Leg("Antioch", "Stockton", 28.4),
        Leg("San Francisco", "Oakland", 9.1),
        Leg("Antioch", "Walnut Creek", 15.8),
        Leg("Vallejo", "Berkeley", 16.2),
        Leg("San Ramon", "Walnut Creek", 9.9),
        Leg("Tracy", "Fremont", 33.6),
        Leg("Martinez", "Concord", 6.7),
        Leg("Lafayette", "Daly City", 22.8),
        Leg("Livermore", "Petaluma", 60.6),
        Leg("Galt", "Mountain View",72.5),
        Leg("Pleasant Hill", "Richmond", 15.8)
        
    };
    
    const int SIZE = (sizeof(a) / sizeof(a[0]));
    
    for(int i = 0; i < SIZE; i++)
        for(int j = i + 1; j < SIZE; j++)
            if(a[j].getDistance() < a[i].getDistance())
                swap(a[i], a[j]); //error is occurring on this line
    
    for(int i = 0; i < SIZE; i++)
    {
        a[i].output(cout);
    }
    
    return 0;
}

Leg::Leg(const char* const start, const char* const end, const double dist) //constructor
:startingCity(start), endingCity(end), distance(dist)
{
    
}

void Leg::output(ostream& out) const //output function
{
    out << "Leg: " << startingCity << " to " << endingCity << ", " << distance << " miles." << endl;
}

bool Leg::operator<(const Leg& rhs)
{
    return distance < rhs.getDistance();
}
#包括
#包括
#包括
#包括
使用名称空间std;
班腿{
常量字符*常量起始城市;
const char*const endingCity;
常数双倍距离;
公众:
支腿(常量字符*常量,常量字符*常量,常量双);

bool操作符由于
const
成员,您的
Leg
类既不可移动构造,也不可移动分配。因此它不能是

从其成员中删除
const
要求,它将得到一个隐式的move构造函数和赋值运算符,
std::swap
将拾取这些

class Leg {
    const char* startingCity;
    const char* endingCity;
    double distance;
    . . .
最后一点注意:
operator注意排序是一种算法,需要做两件事:比较范围中的两个元素,以及移动元素的方法
C++为什么我的交换函数没有被调用

您尚未定义交换函数。因此,无法调用“您的交换函数”

解决方案:定义您调用的函数,或者只调用泛型的
std::swap
,也就是说,如果您的类首先可以被设置为可交换的。它不能被设置为可交换的,因为它有常量成员。第二个问题的解决方案:使成员非常量

另外,不需要定义一个简单的排序函数。标准库提供了一个通用的
std::sort

p.p.S无需使用复数
const int SIZE=(sizeof(a)/sizeof(a[0]);
。您可以使用
std::SIZE(a)


p.p.p.S(inti=0;i
。的范围会更简单。

如上所述,问题是您从未编写过交换函数。存在
std::swap
,并且可能会为您的类重载它,而您没有这样做


但是如果您想要更小的修复,您的比较不需要
.getDistance()
;您编写了
运算符首先,发布准确的错误消息。其次,将数组命名为
a
会使代码难以读取,更不用说由于可能或将来的名称冲突而容易出现错误。请为变量提供更具描述性的名称。我相信它使用的是标准交换,但
Leg。切换到
std::string
将大大有助于解决此问题,否则您将添加5个函数的规则。
bool运算符错误是:没有匹配的函数调用“swap”。我不明白。为什么您认为提供
运算符?感谢您的反馈和提示!感谢解释!@Jeremiah没问题:)如果答案正确的话解决你的问题,你可以接受其中一个。确保选择你认为最有用的答案。
if(a[j].getDistance() < a[i].getDistance())
if(a[j] < a[i])
void swap(Leg const &, Leg const &);