【问题标题】:Overloading operator +: Expression must have integral or unscoped enum type [closed]重载运算符 +:表达式必须具有整数或无范围枚举类型 [关闭]
【发布时间】:2015-10-27 04:37:54
【问题描述】:

我正在编写一些使用链表的代码,我很难确定为什么我的 + 运算符不起作用,我不断收到上述错误。

我错过了什么?

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

struct sortedListNode
{
    char letter;
    int occurrences = 1;
    sortedListNode *next;
};

sortedListNode *operator+(sortedListNode *lhs, sortedListNode *rhs)
{

    int i = 0;
    sortedListNode *head, *tail, *curr, *prev, *tempLoc;
    sortedListNode *list1, *list1curr, *list2, *list2curr;
    list1 = lhs;
    list2 = rhs;

    // Copy list1 into output list

    head = new sortedListNode;
    head->letter = list1->letter;
    head->occurrences = list1->occurrences;
    head->next = NULL;
    tail = head;

    list1curr = list1;
    list1curr = list1curr->next;

    while (list1curr != NULL)
    {
        tempLoc = new sortedListNode;
        tempLoc->letter = list1curr->letter;
        tempLoc->occurrences = list1curr->occurrences;
        tempLoc->next = NULL;

        tail->next = tempLoc;
        tail = tempLoc;

        list1curr = list1curr->next;
    }

    curr = head;
    while (list2curr != NULL)
    {

        while (curr != NULL)
        {

            if (curr->letter == list2curr->letter)
            {
                curr->occurrences++;
                break;
            }
            else if ((curr->letter > list2curr->letter) && (curr == head))
            {
                tempLoc = new sortedListNode;
                tempLoc->next = curr;
                tempLoc->letter = list2curr->letter;
                head = tempLoc;
                break;
            }
            else if ((curr->letter > list2curr->letter) && (curr != head))
            {
                tempLoc = new sortedListNode;
                tempLoc->next = curr;
                tempLoc->letter = list2curr->letter;
                prev->next = tempLoc;
                break;
            }
            else if ((curr == tail) && (curr->letter < list2curr->letter))
            {
                tempLoc = new sortedListNode;
                tempLoc->next = NULL;
                tempLoc->letter = list2curr->letter;
                tail->next = tempLoc;
                tail = tempLoc;
                break;
            }

            prev = curr;
            curr = curr->next;

        }

        curr = head;
        list2curr = list2curr->next;
    }


    return head;


}

sortedListNode *fromString(string inWord)
{

    int i = 0;
    sortedListNode *head, *tail, *curr, *prev, *tempLoc;

    // Put the first letter in as the first element, set head and
    // tail to this element.
    head = new sortedListNode;
    tail = head;

    head->letter = inWord[0];
    head->next = NULL;

    curr = head;
    for (int i = 1; inWord[i] != '\0'; i++)
    {
        while (curr != NULL)
        {

            if (curr->letter == inWord[i])
            {
                curr->occurrences++;
                break;
            }
            else if ((curr->letter > inWord[i]) && (curr == head))
            {
                tempLoc = new sortedListNode;
                tempLoc->next = curr;
                tempLoc->letter = inWord[i];
                head = tempLoc;
                break;
            }
            else if ((curr->letter > inWord[i]) && (curr != head))
            {
                tempLoc = new sortedListNode;
                tempLoc->next = curr;
                tempLoc->letter = inWord[i];
                prev->next = tempLoc;
                break;
            }
            else if ((curr == tail) && (curr->letter < inWord[i]))
            {
                tempLoc = new sortedListNode;
                tempLoc->next = NULL;
                tempLoc->letter = inWord[i];
                tail->next = tempLoc;
                tail = tempLoc;
                break;
            }

            prev = curr;
            curr = curr->next;

        }

        curr = head;

    }

    return head;
}

void printList(sortedListNode *inSortedListNode)
{
    sortedListNode *curr;
    curr = inSortedListNode;
    int nodeCounter = 0;

    while (curr != NULL)
    {
        nodeCounter++;
        cout << "Node " << nodeCounter << " at " << curr << " - Letter = " << curr->letter << ", Occurrences = " << curr->occurrences << ", Next Node = "
            << curr->next << endl;
        curr = curr->next;
    }


}

int main()
{

    string word1, word2;

    sortedListNode *list1;
    sortedListNode *list2;
    sortedListNode *list3;

    cout << "Enter first word: ";
    cin >> word1;
    cout << "Enter second word: ";
    cin >> word2;

    list1 = fromString(word1);
    cout << "Letter list from word one: " << endl;
    printList(list1);

    list2 = fromString(word2);
    cout << "Letter list from word two: " << endl;
    printList(list2);

    list3 = list1 + list2;
    cout << "Letter list from both words: " << endl;
    printList(list3);


    cin.ignore(32767, '\n');

    char dummy[1]{};

    cin.getline(dummy, 1);



}

请注意,我知道运算符定义中有错误,因为我还没有写完。我试图克服将两个链表 sortedListNode 对象作为参数的障碍。

这是一个任务。 main 是由讲师提供的 stub main。运算符 + 应该取两个列表并将它们合并在一起,并输出合并后的列表。

【问题讨论】:

  • 我很难确定您要编译的代码。请发帖MCVE
  • 澄清了运算符调用在 main 中,这就是我遇到语法错误的地方。
  • 应该+ 运算符只是连接两个列表(即将它们链接在一起)还是返回一个等于输入列表连接的新列表?您的代码似乎是后者,但参数(lhsrhs)可能是const sortedListNode*
  • 对不起,它应该返回一个新列表,这是正确的。
  • 你可以使用std命名空间中的函数吗?

标签: c++ linked-list operator-overloading


【解决方案1】:

错误消息的直接原因是没有调用您定义的operator+。那是因为您已将 operator+ 定义为将两个 sortedListNodes 作为参数,但您却传入了两个指针。如果您将运算符更改为采用指针 (sortedListNode*),它将克服直接的语法错误。

然而,这才是你真正的问题开始的地方。您对 operator+ 的实现也有问题。它返回head,它不是sortedListNode 结构的一部分。至关重要的是,它不会使用您传递给它的两个列表中的任何一个。

编辑:现在我们可以看到完整的代码,感谢发布。

我会附和 Walter 所说的:添加指针没有意义。相反,您应该定义一个 operator+ 用于将列表添加在一起:

sortedNodeList operator+(const sortedNodeList& lhs, const sortedNodeList &rhs){
  ...
}

换句话说,你的参数应该是对列表的引用(而不是指针),你的结果应该是一个列表,而不是一个指针。

【讨论】:

  • Head 是指向 *sortedListNode 的第一个节点的指针。如果我发布所有代码可能会更有用,我会这样做。
  • 已更新完整代码。
  • 谢谢,我就这样试试。
【解决方案2】:

对于

sortedListNode *list1, *list2, *list3;
list3 = list1 + list2;

你需要

sortedListNode *operator+(sortedListNode*lhs, sortedListNode*rhs);

但你只提供

sortedListNode *operator+(sortedListNode lhs, sortedListNode rhs);

我还应该说,为指针类型重载 + 运算符是没有意义的(即使允许这样做)。

【讨论】:

  • 谢谢@Walter。有趣的是,如果我这样做,我会在运算符定义本身上得到一个语法错误,说明:“非成员运算符需要一个具有类或枚举类型的参数。”我本质上希望它将两个指向 sortedListNode 的指针作为输入,并返回一个指向 sortedListNode 的指针。
  • 这是一个任务,我完全同意这没有任何意义。在这种情况下,您知道如何将两个基于结构的链表传递给运算符吗?
  • 是连接到列表的想法吗?
  • 是的,就是这样。我不想要一个完整的答案,因为我想自己解决剩下的问题,但我被困在如何将两个列表传递给操作员上。我用我所有的代码更新了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多