如何在运算符重载的情况下访问受保护的函数<<?C++; 对于C++中的一个练习,我必须在一个函数中使用一个受保护的C++来加载操作符

如何在运算符重载的情况下访问受保护的函数<<?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

问题不是函数被保护,而是它不是<代码> const p> 正如错误消息所说,
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)