VC6 и наследование от классов стандартных потоков
От: longlivedeath  
Дата: 23.08.03 19:06
Оценка:
Как заставить vc6 компилировать следующее:
//в хедере:

#ifndef HEADER_H
#define HEADER_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <ostream>

namespace kernel
{
  class StreamBuf:public std::streambuf
  {};

  class LogStream: public std::ostream
  {
  public:
    LogStream(std::streambuf * tt = new StreamBuf)
      : std::ostream(tt)
    {}
    
    ~LogStream()
    {delete rdbuf();}
  };

}

#endif // HEADER_H

//в .срр:
#include "header.h"

int main()
{
  //
  kernel::LogStream out;

  out << "Death!";
  return 0;
}

MinGW компилирует, vc6 ругается:
header.h(26) : error C2512: 'basic_ostream<char,class _STL::char_traits<char> >' : no appropriate default constructor available
header.h(26) : error C2614: 'LogStream' : illegal member initialization: 'ostream' is not a base or member
Использую STLPort последний; StreamBuf на самом деле пишет в файл, я порезал для краткости.
Re: VC6 и наследование от классов стандартных потоков
От: longlivedeath  
Дата: 24.08.03 10:41
Оценка:
vc6 отстой.
компилируется только так:
//header

#ifndef HEADER_H
#define HEADER_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <ostream>

namespace kernel
{
  template <class charT, class traits = std::char_traits<charT> >
  class basic_StreamBuf : public std::basic_streambuf<charT, traits>
  {
    public:
      basic_StreamBuf(){}
  };

  typedef basic_StreamBuf<char> StreamBuf;
  typedef basic_StreamBuf<wchar_t> wStreamBuf;

  template <class charT, class traits = std::char_traits<charT> >
  class basic_LogStream: public std::basic_ostream<charT, traits>
  {
  public:
    basic_LogStream(std::basic_streambuf<charT, traits> * tt)
      : std::basic_ostream<charT, traits>(tt)
    {}
    
    ~basic_LogStream()
    {delete rdbuf();}
  };

  typedef basic_LogStream<char> LogStream;
  typedef basic_LogStream<wchar_t> wLogStream;

}

#endif // HEADER_H

//cpp
#include <iostream>
#include "header.h"

int main()
{
  //
  kernel::LogStream out(new kernel::StreamBuf);

  out << "Death!";
  std::cout << "Doo";
  return 0;
}


MinGW компилирует в обоих случаях.
Re: VC6 и наследование от классов стандартных потоков
От: Павел Кузнецов  
Дата: 26.08.03 06:16
Оценка:
Здравствуйте, longlivedeath, Вы писали:

l> Как заставить vc6 компилировать следующее:

l>
l>   class LogStream: public std::ostream
l>   {
       typedef std::ostream Base;;

l>   public:
l>     LogStream(std::streambuf * tt = new StreamBuf)
l>       : Base(tt)
l>     {}
l>
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.