код:
ostream оператора << вызова родительского ostream
cout << "11122333" << endl;
ожидать:
11122333 \ п
результат:
11122333 \ п
Хорошо.
код:
cout.operator<<("11122333");
cout.operator<<(endl);
ожидать:
11122333 \ п
результат:
00B273F8 \ п
(или какой-либо другой адрес, это приведение к void*
:()
беда: Хотите написать класс, полученный от ostream
class SomeStream : public ostream
{
public:
explicit SomeStream(streambuf* sb) : ostream(sb) { }
template <typename T> SomeStream &operator <<(const T &val)
{
std::ostream::operator<<(val); //Trouble in there!
std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl;
/*some other behavior*/
return *this;
}
SomeStream &operator <<(ostream& (*val) (ostream&))
{
std::ostream::operator<<(val);
/*some other behavior*/
return *this;
}
SomeStream &operator <<(ios_base& (*val) (ios_base&))
{
std::ostream::operator<<(val);
/*some other behavior*/
return *this;
}
};
Когда я вызываю родительский оператор std::ostream::operator<<(val);
val cast to void*
и не нормально работает. Как это правильно? и почему прямой вызов operator<<
для ostream
работает не так, как косвенный вызов.
Выход 'оператор <<()' глобальная функция шаблон не является членом 'станд :: ostream'. –
Как насчет '(cout.operator <<) (" 11122333 ");'? –
@ Kilanny - это фактически 'std :: operator << (cout," 11122333 ");'. –