Re[3]: В std::auto_ptr определен лишний метод?
От: dmitry.maystrenco  
Дата: 30.01.09 19:29
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, dmitry.maystrenco, Вы писали:


DM>>например был изначально std::auto_ptr<int> а мы его присвоим std::auto_ptr<long>


I>Ты не ошибся? Присвоить указатель на int указалю на long?


Выбор int и long не самый удачный, по крайней мере в auto_ptr, для auto_ptr, прокатит без проблем в том случае если классы используемые в параметрах являются элементами в иерархии, причем только с верху вниз, из-за того, что в конструкторе копирования используется присвоение одного указателя другому (настоящих)

class A
{
};

class B : public A
{
};

...

std::auto_ptr<B> b(new B);
std::auto_ptr<A> a = b;

работает, тогда как

std::auto_ptr<A> a(new A);
std::auto_ptr<B> b = a;

уже нет.

Забавно другое, если написать по аналогии с auto_ptr, реализацию:

template<typename _Ty> class A
{
public:
template<typename _Other> A(_Other& _Right)
{
printf("A normal\n");
}
};

class B
{
};

template<> template<> A<long>::A(B& _Right)
{
printf("A special for B\n");
}


то при

double d;
B b;

A<int> a(d);
A<long> c(b);

получаем такой вывод:

A normal
A special for B

и возвращаясь к auto_ptr если попытаться специализировать

namespace std
{
template<>
template<> auto_ptr<int>::auto_ptr(auto_ptr<long>& r)
{
}
}

то компайлер упорно не видит специализации в данном случае, вот в чем прикол.
а на счет int* к long*, это своеобразно, но не так страшно (под AI32 мы ничего страшного не пытались делать )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.