简体   繁体   English

在C ++中调用成员的重载<<运算符

[英]Calling member's overloaded << operator in C++

The following raises a compile-time error. 以下内容引发了编译时错误。 I'm not sure how to call one objects overloaded operator << within another objects << operator? 我不确定如何在另一个对象<<运算符内调用一个对象重载的运算符<<? If anyone could point out what I'm doing wrong, that'd be really helpful .Thanks for your time! 如果有人能指出我在做什么错,那将非常有帮助。感谢您的时间!

card.cpp: card.cpp:

#include "card.h"
#include <iostream>

ostream& operator<<(ostream &out, Card &cCard)
{
    out << cCard.getValueString() 
        << " OF " 
        << cCard.getSuitString() 
        << "S\n";
    return out;
}

string Card::getValueString()
{
    Value value = getValue();
    switch(value) 
    {
        case TWO:           return "TWO";
        case THREE:         return "THREE"; 
        case FOUR:          return "FOUR"; 
        case FIVE:          return "FIVE";
        case SIX:           return "SIX";
        case SEVEN:         return "SEVEN";
        case EIGHT:         return "EIGHT";
        case NINE:          return "NINE";
        case TEN:           return "TEN";
        case JACK:          return "JACK";
        case QUEEN:         return "QUEEN";
        case KING:          return "KING";
        case ACE:           return "ACE"; 
        case NONE_VALUE:    return "NONE_VALUE";
        default:            return "UNKNOWN VALUE";  
    };
}

string Card::getSuitString()
{
    Suit suit = getSuit();
    switch(suit) 
    {
        case SPADE:         return "SPADE";
        case HEART:         return "HEART"; 
        case CLUB:          return "CLUB"; 
        case DIAMOND:       return "DIAMOND";
        case NONE_SUIT:     return "NONE_SUIT";
        default:            return "UNKNOWN SUIT";
    };
}

card.h

#pragma once
#include <iostream>
using namespace std;

 enum Suit  { 
                SPADE, 
                HEART, 
                CLUB, 
                DIAMOND,
                NONE_SUIT 
            };

 enum Value  { 
                TWO=2, 
                THREE, 
                FOUR, 
                FIVE,
                SIX,
                SEVEN,
                EIGHT,
                NINE,
                TEN,
                JACK,
                QUEEN,
                KING,
                ACE, 
                NONE_VALUE
            };

    class Card
    {

        public:
            Card() : m_suit(NONE_SUIT), m_value(NONE_VALUE) { };
            Card(Suit suit, Value value) : m_suit(suit), m_value(value) { };
            Value getValue() { return m_value; };
            Suit getSuit() { return m_suit; };
            void setValue(Value value) { m_value = value; };
            void setSuit(Suit suit) { m_suit = suit; };
            string getValueString();
            string getSuitString();
            friend ostream& operator<<(ostream &out, Card &cCard);
        private:
            Suit m_suit;
            Value m_value;      
    };

hand.cpp: hand.cpp:

#include "hand.h"
#include "card.h"

ostream& operator<<(ostream &out, Card &cCard);

Hand::Hand() 
{

}

Card Hand::getCard(int cardIndex) 
{
    if(cardIndex == 0 || cardIndex == 1)
    {
        return cards[cardIndex];
    }
    else
    {
        cout << "Card index out of bounds.\n";
    }

    return Card(NONE_SUIT, NONE_VALUE);
}

void Hand::setCard(int cardIndex, Suit suit, Value value)
{
    if(cardIndex == 0 || cardIndex == 1)
    {
        cards[cardIndex].setValue(value);
        cards[cardIndex].setSuit(suit);
    }
    else
    {
        cout << "Card index out of bounds.\n";
    }
};

ostream& operator<<(ostream &out, Hand &cHand)
{
    out << cHand.getCard(0) 
        << "\n"
        << cHand.getCard(1);
    return out;
}

hand.h: hand.h:

#pragma once
#include <iostream>
#include "card.h"
using namespace std;

class Hand
{
    public:
        Hand();
        void setCard(int cardIndex, Suit suit, Value value);
        Card getCard(int cardIndex);
        friend ostream& operator<<(ostream &out, Hand &cHand);
    private:
        Card cards[2];      
};

The error is the following: 错误如下:

hand.cpp: In function 'std::ostream& operator<<(std::ostream&, Hand&)': hand.cpp:40: error: no match for 'operator<<' in 'out << ((Hand*)cHand)->Hand::getCard(0)' /usr/include/c++/4.2.1/ostream:112: 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] /usr/include/c++/4.2.1/ostream:121: 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] /usr/include/c++/4.2.1/ostream:131: 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] /usr/include/c++/4.2.1/ostream:169: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, hand.cpp:在函数'std :: ostream&operator <<(std :: ostream&,Hand&)'中:hand.cpp:40:错误:'out <((Hand())中'operator <<'不匹配cHand)-> Hand :: getCard(0)'/usr/include/c++/4.2.1/ostream:112:注意:候选对象是: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] / usr / include /c++/4.2.1/ostream:121:注意: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] /usr/include/c++/4.2.1/ostream:131:注意:std :: basic_ostream <_CharT ,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(std :: ios_base&(*)(std :: ios_base&))[with _CharT = char,_Traits = std :: char_traits] / usr / include /c++/4.2.1/ostream:169:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:173: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:177: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/bits/ostream.tcc:92: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:184: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/bits/ostream.tcc:106: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _Cha _Traits> :: operator <<(long int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream:173:注意:std :: basic_ostream <_CharT,_Traits> &std :: basic_ostream <_CharT,_Traits> :: operator <<(long unsigned int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream:177:注意: std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(bool)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1 /bits/ostream.tcc:92:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(short int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream:184:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(short shortsigned int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/bits/ostream.tcc:106:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits > :: operator <<(int)[with _Cha rT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:195: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:204: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:208: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:213: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:217: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits] /usr/include/ rT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream:195:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(unsigned int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream:204:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(long long int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream:208:注意:std :: basic_ostream < _CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(long long unsigned int)[with _CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/ostream :213:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(double)[with _CharT = char,_Traits = std :: char_traits] / usr / include / c ++ / 4.2.1 / ostream:217:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(float)[with _CharT = char,_Traits = std :: char_traits] / usr / include / c++/4.2.1/ostream:225: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/ostream:229: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/bits/ostream.tcc:120: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits] hand.cpp:4: note: std::ostream& operator<<(std::ostream&, Card&) hand.cpp:38: note: std::ostream& operator<<(std::ostream&, Hand&) c ++ / 4.2.1 / ostream:225:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(long double)[with _CharT = char,_Traits = std: :char_traits] /usr/include/c++/4.2.1/ostream:229:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT,_Traits> :: operator <<(const void *)[使用_CharT = char,_Traits = std :: char_traits] /usr/include/c++/4.2.1/bits/ostream.tcc:120:注意:std :: basic_ostream <_CharT,_Traits>&std :: basic_ostream <_CharT, _Traits> :: operator <<(std :: basic_streambuf <_CharT,_Traits> *)[with _CharT = char,_Traits = std :: char_traits] hand.cpp:4:注意:std :: ostream&operator <<(std: :ostream&,Card&)hand.cpp:38:注意:std :: ostream&运算符<<(std :: ostream&,Hand&)

Any ideas on what Im missing? 关于缺少什么我有什么想法吗?

Your operator << functions should take the right hand side argument by const reference. 您的operator <<函数应通过const引用接受右侧参数。 It's telling you that it can't bind the temporary returned by getCard to the non-const reference argument of the operator. 它告诉您不能将getCard返回的临时绑定到运算符的非常量引用参数。

The incredibly long error message is because there are so incredibly many overloads of << in scope at any one time, and the compiler is listing all of them as, "I tried this one but it didn't work." 令人难以置信的长错误消息是因为任何时候范围内<<都有如此之多的重载,并且编译器将它们全部列出为:“我尝试了这个,但是没有用。”

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM