Вы можете получить что-то, что компилируется и работает, но я бы не стал этого делать на вашем месте.
Boost определяет определенные функции для построения auto_ptr
. Если вы переопределите это каким-либо образом, вы нарушили их спецификацию.
Придумайте имя для вашей новой функциональности, сделайте ее заводской функцией и не беспокойтесь о том, чтобы специализировать чужой шаблон.
РЕДАКТИРОВАТЬ: наследование от auto_ptr
является еще одним вариантом, если вы действительно настроены на изменение семантики инициализации:
tempate < class T, T *d >
struct defaulted_auto_ptr
: public auto_ptr< T > {
defaulted_auto_ptr( T *p = d ) throw() : auto_ptr<T>( p ) {} // set default
defaulted_auto_ptr( auto_ptr<T> &r ) throw()
: auto_ptr<T>( r ) {} // allow conversion
template< class O > defaulted_auto_ptr( auto_ptr<O> &r ) throw()
: auto_ptr<T>( r ) {}
};
fstream default_file;
typedef defaulted_auto_ptr< fstream, &default_file > file_ptr;
auto_ptr< fstream > baseptr = file_ptr(); // can assign to auto_ptr, but unsafe
Я немного сомневаюсь в компромиссе между затратами и выгодой, но это лучше, чем полное переосмысление auto_ptr
.
Вы все еще должны выяснить, что делать, если дефолтный объект уничтожен. default_file
выше будет delete
d, потенциально много раз.