Нет, вы не можете, вы должны разыменовать это:
SetOponent( * Class )
Что касается поведения при копировании, я рекомендую вам прочитать хорошую книгу по С ++, такую как «Эффективный С ++» Скотта Мейерса. Поведение auto_ptr при копировании крайне неинтуитивно и, возможно, выходит за рамки SO-ответа. Однако ничто не решалось ...
Когда копируется auto_ptr, право собственности передается от оригинала к копии. Например:
auto_ptr <Foo> p1( new Foo );
в этот момент p1 владеет указателем на объект Foo.
auto_ptr <Foo> p2( p1 );
После копирования p2 владеет указателем, а p1 изменяется , так что теперь он содержит указатель NULL. Это важно, потому что копирование происходит во многих местах в C ++. Вы никогда не должны, например, передавать auto_ptrs по значению в функции или пытаться сохранить их в стандартных контейнерах библиотеки.