c++ - 我在这里做错了什么?我的编译中有几个 "no match for operator"错误

标签 c++

这些似乎是我唯一的错误。据我了解,如果我将“sortedListClass”设置为等于另一个声明的“sortedListClass”,或者如果我询问它们是否小于、等于、不等于等,我只需要重载一个运算符。但这些是用户声明...未声明“sortedListClasses”所以我很困惑..任何人都可以阐明这些编译错误吗?谢谢!

我将包括我拥有的所有代码,以防其中任何一个对错误有重要意义...

基本上我正在处理带有结构和指针的链表..

这是我的 list.h:

#ifndef LIST_H
#define LIST_H

struct cities
{
    string city;    
};
typedef cities listItemType;
typedef struct Node* nodePtr;
struct Node
{
    listItemType data;
    nodePtr next;
};

#endif

这是我的 sortedListClass.h :

#include <iostream>
#include <fstream>

using namespace std;

#include "list.h"


#ifndef sortedList_Class
#define sortedList_Class

class sortedListClass
{

    private:
        int size;
        nodePtr Head;

    public:
        //Constructors and Destructor
        sortedListClass();
        sortedListClass(const sortedListClass& L);
        ~sortedListClass();

        //List operations
        void ListInsert(listItemType NewItem);
        void ListDelete();
        void RetrieveCity();
        void PrintList();
        int ListLength() const;
        bool ListIsEmpty() const;
}; //End Class
#endif

这是我的 sortedListClass.cpp :

//Sorted List Class
//Contains function definitions for actions towards the cities Linked List

#include "sortedListClass.h"
#include <iostream>
#include <cstdlib>
#include <string>

sortedListClass::sortedListClass()
{
    size = 0;
    Head = NULL;
}

sortedListClass::sortedListClass(const sortedListClass& List)
{
    if(List.Head == NULL)
        Head = NULL;
    else
    {
        Head = new Node;
        Head->data = List.Head->data;

        nodePtr NewPtr = Head;

        for(nodePtr OrigPtr = List.Head -> next; OrigPtr != NULL; OrigPtr = OrigPtr-> next)
        {
            NewPtr-> next = new Node;
            NewPtr = NewPtr -> next;
            NewPtr -> data = OrigPtr -> data;
        }
            NewPtr -> next = NULL;
    }
}

sortedListClass::~sortedListClass()
{
    bool success;
    while(!ListIsEmpty())
        ListDelete();
}

bool sortedListClass::ListIsEmpty() const
{
    return bool( size == 0);
}

int sortedListClass::ListLength() const
{
    return size;
}

void sortedListClass::RetrieveCity()
{
    string city;
    bool success;
    cout <<"Input a city name: ";
    cin >> city;
    cout << endl;
    nodePtr cur = Head;
    while(cur != NULL)
    {
        if(cur->data == city)
        {
            cout <<"This city is found" << endl;
            success = true;
        }
        cur = cur->next;
    }
    if(!success)
        cout <<"This city is not served" << endl;

}

void sortedListClass::PrintList()
{
    nodePtr cur = Head;
    cout << "Number of cities: " << size << endl;
    while(cur!= NULL)
    {
        cout <<cur->data;
        cur = cur->next;
    }
}

void sortedListClass::ListInsert(listItemType Item)
{
    nodePtr newNode = new Node;
    newNode -> data = Item;
    newNode->next = NULL;
    if(Head = NULL)
        Head = newNode;
    else if (Item < Head->data)
    {
        newNode->next = Head;
        Head = newNode;
    }

    nodePtr curr = Head, prev = Head;
    while((newNode->data > curr->data) && (curr != NULL))
    {
        prev = curr;
        curr = curr -> next;
    }

    if(curr->next == NULL)
    {
        curr->next = newNode;
        newNode->next = NULL;
    }
    else if(curr->data > newNode->data)
    {
        newNode->next = curr;
        prev->next = newNode;
    }
}

void sortedListClass::ListDelete()
{
    bool success = false;
    string city;
    cout << "Enter a city name to delete from the list: " << endl;
    cin >> city;
    nodePtr p = new Node;
    nodePtr curr, prev;
    curr = Head;
    prev = Head;
    p -> data = city;
    p -> next = NULL;
    if(Head == NULL)
        cout <<"Unable to delete anything, list is empty." << endl;
    else
    {
        while(curr->next != NULL)
        {
            if(curr -> data == p -> data)
            {
                prev->next = curr->next;
                curr->next = NULL;
                delete curr;
                curr = NULL;
                success = true;
            }
            else
            prev = curr;
            curr = curr->next;
        }
    }
    if(!success)
        cout <<"This city does not exist. Deletion cannot be performed." << endl;

}

这是我遇到的错误...

sortedListClass.cpp: In member function ‘void sortedListClass::RetrieveCity()’:
sortedListClass.cpp:63: error: no match for ‘operator==’ in ‘cur->Node::data == city’
sortedListClass.cpp: In member function ‘void sortedListClass::PrintList()’:
sortedListClass.cpp:81: error: no match for ‘operator<<’ in ‘std::cout << cur->Node::data’
/usr/include/c++/4.4/ostream:108: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:117: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:127: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:165: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:169: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:173: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/bits/ostream.tcc:91: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:180: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/bits/ostream.tcc:105: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:191: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:200: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:204: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:209: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:213: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:221: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/ostream:225: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/bits/ostream.tcc:119: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
sortedListClass.cpp: In member function ‘void sortedListClass::ListInsert(listItemType)’:
sortedListClass.cpp:93: error: no match for ‘operator<’ in ‘Item < ((sortedListClass*)this)->sortedListClass::Head->Node::data’
sortedListClass.cpp:100: error: no match for ‘operator>’ in ‘newNode->Node::data > curr->Node::data’
sortedListClass.cpp:111: error: no match for ‘operator>’ in ‘curr->Node::data > newNode->Node::data’
sortedListClass.cpp: In member function ‘void sortedListClass::ListDelete()’:
sortedListClass.cpp:128: error: no match for ‘operator=’ in ‘p->Node::data = city’
list.h:5: note: candidates are: cities& cities::operator=(const cities&)
sortedListClass.cpp:136: error: no match for ‘operator==’ in ‘curr->Node::data == p->Node::data’
[1]+  Done                    scite sortedListClass.cpp

最佳答案

I only needed to overload an operator if I was setting "sortedListClass" equal to another declared "sortedListClass" or if I was asking if they were less than, equal to, not equal to, etc

您正在使用 listItemType 执行这些操作,并且从未为其创建任何运算符。

看看它如何提示诸如 ‘cur->Node::data == city’ 之类的表达式?左侧的类型为 listItemType,右侧的类型为 std::string。编译器不知道您希望它对这两件事做什么。

类似地:

error: no match for ‘operator>’ in ‘newNode->Node::data > curr->Node::data’

该表达式的两边都有类型 listItemType。您需要为该类型定义 operator>

我意识到错误输出冗长而复杂,但您需要的所有信息在某处!

关于c++ - 我在这里做错了什么?我的编译中有几个 "no match for operator"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15869179/

相关文章:

c++ - 使用字符串作为文件容器

c++ - 不完整类型 "cv::Mat"opencv c++

c++ - 从段落中提取句子

c++ - NULL 指针调用立即失败

c++ - 如何从字符串创建 web::uri 并将其放入 client.connect() 中?

c++ - 在 async_resolve 处理程序中出现 "Service not found"错误

c++ - 使用通用引用实现前向函数

java - 在android中使用opencv检测玩具车后面

c++ - 为什么自由函数指针总是指针类型,而成员函数指针实际上不是指针?

c++ - 生成大小不是 16 的倍数的加密数据