简体   繁体   English

C ++没有找到需要右手操作数的<<运算符

[英]C++ No << operator found which takes right-hand operand

I am working on some C++ homework and have hit a snag, I cannot run my displayList() function in my linkedlist class. 我正在做一些C ++作业,遇到了麻烦,无法在我的链表类中运行displayList()函数。 I receive the following error. 我收到以下错误。

Error 1 error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'weatherstats' (or there is no acceptable conversion) c:\\users\\larry\\documents\\visual studio 2013\\projects\\weatherstats\\weatherstats\\linkedlist.h 100 1 WeatherStats 错误1错误C2679:二进制'<<':未找到采用'weatherstats'类型的右侧操作数的运算符(或没有可接受的转换)c:\\ users \\ larry \\ documents \\ visual studio 2013 \\ projects \\ weatherstats \\ weatherstats \\ linkedlist.h 100 1 WeatherStats

So I need to overload the << operand but I have tried using a few examples I found online but with no luck. 因此,我需要重载<<操作数,但是我尝试使用一些我在网上找到但没有运气的示例。 Can someone help me with my << overload operator please? 有人可以帮我<<过载运算符吗?

EDIT: Added Weatherstats.cpp 编辑:添加了Weatherstats.cpp

EDIT 2: I created an overloaded << operand in my weatherstats.cpp file, I updated my content below. 编辑2:我在weatherstats.cpp文件中创建了一个重载的<<操作数,我在下面更新了我的内容。 Instead of outputting my data, it outputs all data I enter as 1. I enter 2 for snow and it prints out 1 when using my displayList() function. 它不输出我的数据,而是输出我输入为1的所有数据。我输入2表示积雪,并且在使用displayList()函数时将输出1。

linkedlist.h 链表

#pragma once

#include"WeatherStats.h"
#include<iostream>
#include<string>

using namespace std;


template <class T>
class linkedlist
{
private:

    struct ListNode
    {
        T value;                //Current value of node
        struct ListNode *next;  //Pointer to next node
    };

    ListNode *head;             //Head pointer

public:
    /*!
    Constructors
    !*/
    linkedlist()
    {
        head = NULL;
    };


    /*!
    Destructors
    !*/
    ~linkedlist();

    /*!
    Prototypes
    !*/
    void appendNode(T);         //Append a node to list
    void insertNode(T);         //Insert a node to list
    void deleteNode(T);         //delete a node in list
    void searchList(T);         //Search a node in list
    void displayList() const;           //Display the full list

    friend ostream &operator << (ostream&, linkedlist<T> &);
};


//**
//Append Node
//**
template <class T>
void linkedlist<T>::appendNode(T newValue)
{
    ListNode *newNode;          //Point to new node
    ListNode *nodePtr;          //Move through list

    //Assign newValue to new node
    newNode = new ListNode;
    newNode->value = newValue;
    newNode->next = NULL;

    if (!head)
    {   //If empty assign new node as head
        head = newNode;
    }
    else
    {   //Assign head to nodePtr
        nodePtr = head;

        //Find last node in list
        while (nodePtr->next)
        {
            nodePtr = nodePtr->next;
        }

        //Insert newNode as the last node
        nodePtr->next = newNode;
    }
}

//**
//Display List
//**

template <class T>
void linkedlist<T>::displayList()const
{

    ListNode *nodePtr;

    //Assign head to nodePtr
    nodePtr = head;

    //While nodePtr pointing to a node, print to screen
    while (nodePtr)
    {
        //Print value
        cout << nodePtr->value << endl; //ERROR C2679 HERE

        //Move nodePtr to next node
        nodePtr = nodePtr->next;
    }

}


//**
//Insert Node
//**
template <class T>
void linkedlist<T>::insertNode(T newValue)
{
    ListNode *newNode;
    ListNode *nodePtr;
    ListNode *previousNode = NULL;

    //New node
    newNode = new ListNode;
    newNode->value = newValue;

    //If list is empty assign newValue to head
    if (!head)
    {
        head = newNode;
        newNode->next = NULL;
    }
    else
    {
        //Assign head to nodePtr
        nodePtr = head;

        //Pass over all nodes who are less than newValue
        while (nodePtr != NULL && nodePtr->value < newValue)
        {
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
        }

        //If new node will be first, insert before all other nodes
        if (previousNode == NULL)
        {
            head = newNode;
            newNode->next = nodePtr;
        }
        else
        {
            previousNode->next = newNode;
            newNode->next = nodePtr;
        }
    }
}


//**
//Delete Node
//**
template <class T>
void linkedlist<T>::deleteNode(T searchValue)
{

    ListNode *nodePtr;              //Traverse our list
    ListNode *previousNode = NULL;  //Points to previous node

    //Check if list is empty
    if (!head)
    {
        cout << "This list is empty." << endl;
        return;
    }

    //Delete head if == searchValue
    if (head->value == searchValue)
    {
        nodePtr = head->next;
        cout << head->value << " deleted" << endl;
        delete head;
        head = nodePtr;
    }

    else
    {
        //Set nodePtr to head
        nodePtr = head;

        //Skip nodes not equal num
        while (nodePtr != NULL && nodePtr->value != searchValue)
        {
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
        }

        //Link previous node to the node after nodePtr and then delete
        if (nodePtr)
        {
            previousNode->next = nodePtr->next;
            cout << nodePtr->value << " deleted" << endl;
            delete nodePtr;
        }
    }
}


//**
//Search List
//**
template <class T>
void linkedlist<T>::searchList(T searchValue)
{
    ListNode *nodePtr;              //Traverse our list
    ListNode *previousNode = NULL;  //Points to previous node
    int counter = 0;

    //Check if list is empty
    if (!head)
    {
        cout << "This list is empty." << endl;
        return;
    }

    //Check if head == searchValue
    if (head->value == searchValue)
    {
        cout << head->value << " found at position 0" << endl;
    }

    else
    {

        //set nodePtr to head
        nodePtr = head;

        //Pass over all nodes that do not equal searchValue
        while (nodePtr != NULL && nodePtr->value != searchValue)
        {
            previousNode = nodePtr;
            nodePtr = nodePtr->next;
            counter++;
        }

        //When nodePtr == searchValue
        if (nodePtr)
        {
            cout << nodePtr->value << " found at position " << counter << endl;
        }

        else
        {
            cout << "-1: Value not found." << endl;
        }
    }
}


//**
//Destructor
//**
template <class T>
linkedlist<T>::~linkedlist()
{
    ListNode *nodePtr;   // To traverse the list
    ListNode *nextNode;  // To point to the next node

    // Position nodePtr at the head of the list.
    nodePtr = head;

    // While nodePtr is not at the end of the list...
    while (nodePtr != NULL)
    {
        // Save a pointer to the next node.
        nextNode = nodePtr->next;

        // Delete the current node.
        delete nodePtr;

        // Position nodePtr at the next node.
        nodePtr = nextNode;
    }
}




template <class T>
ostream &operator << (ostream stream, linkedlist<T> &obj)
{
    stream >> obj.value;

    return stream;
}

main.cpp main.cpp

#include "linkedlist.h"
#include "WeatherStats.h"
#include <iostream>
#include <string>

using namespace std;

int main()
{
    int int_numMonths;      //Hold number of months value
    double dbl_rain;        //Hold rain value
    double dbl_snow;        //Hold snow value
    double dbl_sunnyDays;   //Hold sunny days value

    //Create lnk_list object with weatherstats
    linkedlist<weatherstats>weather_list;

    cout << "Weather Data" << endl;
    cout << endl;
    cout << "What is the number of months you want to enter data for?: ";
    cin >> int_numMonths;
    cout << endl;

    //Loop to enter each months values
    for (int i = 0; i < int_numMonths; i++)
    {
        cout << "Month " << i + 1 << endl;
        cout << "Enter amount of rain: " << endl;
        cin >> dbl_rain;
        cout << "Enter amount of snow: " << endl;
        cin >> dbl_snow;
        cout << "Enter number of Sunny Days: " << endl;
        cin >> dbl_sunnyDays;

        //Create weatherstats obj and pass it rain,snow and sunnyDays
        weatherstats month_data(dbl_rain,dbl_snow,dbl_sunnyDays);

        weather_list.appendNode(month_data);

    }

    weather_list.displayList();

}

Weatherstats.cpp Weatherstats.cpp

    #include "WeatherStats.h"

    #include <iostream>

    using namespace std;

    /*!
     Constructors
    !*/
    weatherstats::weatherstats()
    {
        dbl_rain = 0;
        dbl_snow = 0;
        dbl_sunnyDays = 0;
    }

    weatherstats::weatherstats(double r, double s, double d)
    {
        dbl_rain = r;
        dbl_snow = s;
        dbl_sunnyDays = d;
    }

    /*!
     Accessors
    !*/
    double weatherstats::getRain()
    {
        return dbl_rain;
    }

    double weatherstats::getSnow()
    {
        return dbl_snow;
    }

    double weatherstats::getsunnyDays()
    {
        return dbl_sunnyDays;
    }

    /*!
     Mutators
    !*/
    void weatherstats::setRain(double r)
    {
        dbl_rain = r;
    }

    void weatherstats::setSnow(double s)
    {
        dbl_snow = s;
    }

    void weatherstats::setsunnyDays(double d)
    {
        dbl_sunnyDays = d;
    }

//Overload Opperator
ostream& operator << (ostream &stream, weatherstats &obj)
{
    stream <<&weatherstats::getRain << " - " << &weatherstats::dbl_snow << " - " << &weatherstats::getsunnyDays << endl;
    return stream;
}

I'm going to take a stab in the dark with this, as I haven't touched templates or overloading for a couple of years. 我将为此在暗中刺伤,因为我已经两年没有碰模板或超载了。

Do you have the << operator overloaded for your weatherstats class? 您的weatherstats类是否有<<操作符过载?

Your error line is trying to print the value member variable. 您的错误行正在尝试打印value成员变量。 In your ListNode definition you say value is of type T (ie a template). ListNode定义中,您说valueT类型(即模板)。

In your main() you are creating a linkedlist with your template type as weatherstats . 在你main()要创建一个使用您的模板类型作为一个LinkedList weatherstats Your error also states that it cannot convert the weatherstats type. 您的错误还指出,它无法转换weatherstats类型。

So the question is: Are you Overloading << for the weatherstats class ? 因此,问题是: 您是否在weatherstats类中超载<<

Unfortunately, you haven't posted the code for this class, so we can't go any further than this. 不幸的是,您尚未发布该类的代码,因此我们别无所求。 Edit: Code has been posted - still no evidence of overloading 编辑:代码已发布-仍然没有超载的证据

(Also I think Baget makes a good point about the direction of your stream operator later on) (另外,我认为Baget稍后将为您的流运算符的方向提供一个很好的观点)

EDIT2 : How should you call a function? EDIT2 :您应该如何调用函数? Is it &classname::function or object.function() ? &classname::function还是object.function()吗?

isn't stream >> obj.value; 不是stream >> obj.value; need to be stream<<obj.value; 需要为stream<<obj.value;

it is OUTPUT stream not INPUT OUTPUT流而不是INPUT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 C ++ Boost - 没有找到哪个运算符采用&#39;boost :: filesystem :: path&#39;类型的右手操作数 - C++ Boost - no operator found which takes a right-hand operand of type 'boost::filesystem::path' 重载&lt;&lt;在C ++错误中的运算符:::二进制&#39;&lt;&lt;&#39;:找不到使用类型为&#39;const std :: string的右侧操作数的运算符 - Overloading the << operator in C++ error ::: binary '<<' : no operator found which takes a right-hand operand of type 'const std::string c ++错误c2679:二进制&#39;[&#39;:未找到采用&#39;SalesItem&#39;类型的右侧操作数的运算符(或者没有可接受的转换) - c++ error c2679: binary '[' : no operator found which takes a right-hand operand of type 'SalesItem' (or there is no acceptable conversion) 错误C ++ 2679(二进制&#39;&gt;&gt;&#39;:找不到使用类型为&#39;const std :: string&#39;的右侧操作数的运算符(或没有可接受的转换)) - Error C++ 2679 (binary '>>': no operator found which takes a right-hand operand of type 'const std::string' (or there is no acceptable conversion)) 错误 C2679:二进制“&gt;&gt;:未找到采用“GradeType”类型的右侧操作数的运算符 - error C2679: binary ' >> : no operator found which takes a right-hand operand of type 'GradeType' 错误 C2679 二进制“&lt;&lt;”:未找到采用“T”类型右侧操作数的运算符 - Error C2679 binary '<<': no operator found which takes a right-hand operand of type 'T' 错误C2679:二进制&#39;==&#39;:未找到采用类型为右侧的操作数的运算符 - error C2679: binary '==' : no operator found which takes a right-hand operand of type 错误C2679:二进制&#39;+&#39;:未找到采用类型为右侧的操作数的运算符 - Error C2679: binary '+' : no operator found which takes a right-hand operand of type C2679 二进制“-=”:未找到采用“T”类型右侧操作数的运算符(或没有可接受的转换) - C2679 binary '-=': no operator found which takes a right-hand operand of type 'T' (or there is no acceptable conversion) C2679 二进制“&lt;&lt;”:未找到采用右手操作数类型的运算符 - C2679 binary '<<': no operator found which takes a right-hand operand of type
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM