В коде приведенном ниже программа почему-то падает в случае (2).
Просто фантастика, не могу понять почему... Уже день за отладчиком провел...
Помогите, пожалуйста...
// TestErr.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
namespace Gr
{
struct Error
{
virtual const char * type() = 0;
virtual const char * what() = 0;
};
class RuntimeError
: public Error
{
public:
RuntimeError( const string& sErr )
: mErr( sErr )
{}
private:
const char * type()
{ return "RUNTIME ERROR"; }
const char * what()
{ return mErr.c_str(); }
string mErr;
};
template<typename T>
class weak_ptr
{
public:
weak_ptr( T * p = 0 )
: mp( p )
{}
template<typename U>
weak_ptr( const weak_ptr<U>& wp )
{
mp = wp.mp;
wp.reset();
}
template<typename U>
weak_ptr( U * p )
: mp( p )
{
}
~weak_ptr()
{ reset(); }
void reset( T * p = 0 )
{
if( mp != 0 )
delete mp;
mp = p;
}
operator bool () const
{
return mp != 0;
}
T * operator -> () const
{
assert( mp != 0 );
return mp;
}
private:
T * mp;
}; // class weak_ptr
class ErrStorage
{
public:
ErrStorage( Error * p = 0 )
: mp( p )
{}
Error * operator -> () const
{ return mp; }
operator bool () const
{ return mp != 0; }
private:
Error * mp;
};
//typedef ErrStorage ErrorPtr; // (1)
typedef weak_ptr<Error> ErrorPtr; // (2)
//typedef Error * ErrorPtr; // (3)
ErrorPtr someOperation( int arg1, int arg2 )
{
if( arg1 > arg2 )
return new RuntimeError("error in arguments");
return 0;
}
}
int main(int argc, char * argv[])
{
cout << "IN MAIN" << endl;
Gr::ErrorPtr e;
if( e = Gr::someOperation(15, 10) )
{
cout << " (" << e->type() << "): " << e->what() << endl;
}
getchar();
return 0;
}