Здравствуйте, 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 мы ничего страшного не пытались делать

)