[英]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.