Прошу прощения за то, что я дублирую this question, но у меня нет репутации, необходимой для комментариев, и ответы там не убедительны для меня.нет соответствия для 'operator <<' для std :: endl после перегрузки
#include<iostream>
class my_ostream : public std::ostream
{
public:
std::string prefix;
my_ostream():prefix("*"){}
my_ostream& operator<<(const std::string &s){
std::cout << this->prefix << s;
return *this;
}
};
int main(){
my_ostream s;
std::string str("text");
s << str << std::endl;
}
Здесь я получаю:
не подходит для 'оператора < <' в «s.my_ostream :: оператор < < (((Const станд :: строка &) ((Const станд: : строка *) (& ул)))) < < станд :: епсИ»
, и я не понимаю, почему. Если он работает для ostream, он должен работать для my_ostream. Эта программа работает:
#include <iostream>
using namespace std;
class a{};
class b:public a{};
class c:public b{};
void f(a){cout << 'a' << endl;}
void f(b){cout << 'b' << endl;}
void f(b, a){cout << "b, a" << endl;}
void f(c){cout << 'c' << endl;}
void f(c, int){cout << "c, int" << endl;}
void f(a*){cout << "pa" << endl;}
void f(b*){cout << "pb" << endl;}
void f(b*, a*){cout << "pb, pa" << endl;}
void f(c*){cout << "pc" << endl;}
void f(c*, int){cout << "pc, int" << endl;}
int main(){
a ao; b bo; c co;
f(ao); f(bo); f(co);
f(co, ao);
a *pa=new(a); b *pb=new(b); c *pc=new(c);
f(pa); f(pb); f(pc);
f(pc, pa);
return 0;}
Он выводит:
a
b
c
b, a
pa
pb
pc
pb, pa
Так просто перегрузка не объясняет эту ошибку. Кроме того, здесь я не представляю шаблоны, поэтому не заданные параметры типа шаблона не должны играть роли. Чтение кода iostream оказывается очень сложным, поэтому я ценю любое понимание.
Оказывается, что 'std :: ostream s;' тоже не работает, поэтому это довольно сложно и трудно понять. –
Интернет говорит, что 'cout' имеет тип' ostream'. Кто-нибудь может развязать этот узел? :) –