如何在运算符重载的情况下访问受保护的函数<<?C++; 对于C++中的一个练习,我必须在一个函数中使用一个受保护的C++来加载操作符
问题不是函数被保护,而是它不是<代码> const p> 正如错误消息所说,如何在运算符重载的情况下访问受保护的函数<<?C++; 对于C++中的一个练习,我必须在一个函数中使用一个受保护的C++来加载操作符,c++,operator-overloading,C++,Operator Overloading,问题不是函数被保护,而是它不是 const p> 正如错误消息所说,c是const,原因是const-Card&c,从那时起,您只能在c上调用const成员函数 因此,要么让您的toStream成员函数const: virtual std::ostream & toStream(std::ostream & out) const 或者更改流式处理操作符,使c不为常量。但不建议这样做,如果希望函数更改/替换传递的参数,则只应作为非常量ref传递: std::ostream &am
c
是const
,原因是const-Card&c
,从那时起,您只能在c
上调用const成员函数
因此,要么让您的toStream
成员函数const
:
virtual std::ostream & toStream(std::ostream & out) const
或者更改流式处理操作符,使c
不为常量。但不建议这样做,如果希望函数更改/替换传递的参数,则只应作为非常量ref传递:
std::ostream & operator<<(std::ostream & out, Card &c)
std::ostream&operator在我的项目中只有一个类,那就是类“Card”。所以我不需要为momentOk@Hari_Sheldon继承遗产,你只需确认我所理解的^^^太好了!当我在一个类之前添加关键字const,并且我在这个类中使用一个函数时,我必须在这个函数中添加关键字const?一个没有标记为const
的成员函数可以更改对象成员,但是使用const-Card&c
你说c
是const
并且不能更改,因此,您只能对其执行保证对象不会更改的操作,而不是const
的成员函数也不能保证。好的,我不明白,谢谢您的帮助和解释^^我不会更改运算符
#include <Card.hpp>
using namespace std;
int main()
{
Card card("montain");
cout << card << "\n";
return 0;
}
clang++ -Wall -std=c++14 -c -o obj/main.o src/main.cpp -I include
clang++ -Wall -std=c++14 -c -o obj/Card.o src/Card.cpp -I include
src/Card.cpp:5:12: error: member function 'toStream' not viable: 'this' argument has type 'const Card', but function is not
marked const
return c.toStream(out);
^
include/Card.hpp:12:32: note: 'toStream' declared here
virtual std::ostream & toStream(std::ostream & out){out << name;return out;}
^
1 error generated.
makefile:16: recipe for target 'obj/Card.o' failed
make: *** [obj/Card.o] Error 1
CC = clang++
CFLAGS = -Wall -std=c++14
HDIR = include
ABSTRACT = obj/Card.o
.PHONY: doc
compile: bin/main
./bin/main
bin/main: obj/main.o ${ABSTRACT}
${CC} ${CFLAGS} -o $@ $^
obj/%.o: src/%.cpp
${CC} ${CFLAGS} -c -o $@ $< -I ${HDIR}
doc:
doxygen Doxyfile
clean:
rm obj/*.o
rm bin/*
cleanDoc:
rm doc/* -rf
src/Card.cpp:5:12: error: member function 'toStream' not viable: 'this' argument has type 'const Card', but function is not
marked const
return c.toStream(out);
virtual std::ostream & toStream(std::ostream & out) const
std::ostream & operator<<(std::ostream & out, Card &c)