Как заставить 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 на самом деле пишет в файл, я порезал для краткости.
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 компилирует в обоих случаях.
Здравствуйте, 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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен