ostream operator<< 调用父 ostream

ostream operator<< call parent ostream

代码:

cout << "11122333" << endl;

预计:
11122333\n
结果:
11122333\n
好的。
代码:

cout.operator<<("11122333");
cout.operator<<(endl);

预计:
11122333\n
结果:
00B273F8\n
(或其他一些地址,它被转换为 void* :( )

麻烦: 想写 class 来自 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 转换为 void* 而不是正常工作。 怎么做才对?以及为什么 ostream 的直接调用 operator<< 与间接调用不同。

const char* 的输出 operator << 不是类型 ostream 的成员。 Only those重载是成员函数,其中之一是for void*。 还有non-member overloads.

有解决方法:

  template <typename T> SomeStream &operator <<(const T &val) 
  {
    static_cast<std::ostream&>(*this) << val; //Trouble in there!
    std::cout << "<<" << " " << typeid(T).name() << " " << val << std::endl;
    /*some other behavior*/
    return *this;
  }