我目前正在为学校做一个计划,这是我第一次使用遗产。我的问题是我在尝试打印时从Visual Studio中收到这些错误。 C2296:<<非法的,左操作数的类型为' const char [7]' 和 C2297:<<非法,右操作数的类型为' const std :: string *'
我的打印行是:
string printOutput = "Book #" << &getCallNumber() << ", title: " << &getTitle() << " by " << &getAuthor() << " pages: " << getNumPages() << ", status: " << getStatus() << ", fees: " /*<< getFees()*/;
,函数定义如下:
const string &getCallNumber() const {
return callNumber;
}
const string &getTitle() const {
return title;
}
const string &Book::getAuthor() const
{
return author;
}
int Book::getNumPages() const
{
return numPages;
}
Status getStatus() const {
return status;
}
我还没有定义getFees,因此它被注释掉了。 当我带走他们的&amp;&#;;时,我会得到更多的错误 任何帮助都会非常感激,我一直坐在这里经过几个小时,但不能绕过它。
答案 0 :(得分:1)
我的打印行是:
string printOutput = "Book #" << &getCallNumber() << ", title: " << &getTitle() << " by " << &getAuthor() << " pages: " << > getNumPages() << ", status: " << getStatus() << ", fees: " /*<< > getFees()*/;
在C ++中,如果你想打印一些东西,你可以简单地std::cout
它(假设你要打印的东西已经为operator<<
重载ostream
) - 不需要首先构造一个string
对象
std::cout << "Book #" << getCallNumber() << ", title: " << getTitle() << " by "
<< getAuthor() << " pages: " << getNumPages() << ", status: " << getStatus() << ", fees: ";
由于getStatus()
会返回Status
,因此您应该确保Status
类已为operator <<
重载ostream
。
请注意,前面没有&
个符号 - 添加&
将获取string
的地址,而不是string
本身的地址。
<强>更新强>
您可以在任意位置超载operator<<
。如果它不会访问该类的friend
部分,则它不需要是private
函数。鉴于Status
是enum class
,我认为将其重载到main
以上就足够了。并给出了
enum class Status { AVAILABLE, ON_LOAN, PROCESSED, MISSING, OVERDUE, };
您可以执行类似
的操作ostream& operator<<(ostream& os, Status s) {
switch(s)
{
case Status::AVAILABLE:
os << "AVAILABLE";
break;
case Status::ON_LOAN:
os << "ON_LOAN";
break;
....//And do the same thing for the other cases
}
return os;
}