Типы не являются конвертируемыми по умолчанию таким образом (потому что вы, возможно, не хотите, чтобы объекты делали это). В общем, вы можете использовать два подхода:
Реализация явной функции приведения, которая может быть полезна для приведения во время выполнения, например boost's shared_ptr dynamic_pointer_cast . Вы бы получили что-то вроде:
template <typename To, typename From>
myclass<To> myclass_cast(const myclass<From>&)
{ /* do a runtime cast, possibly with exceptions */ }
Второй метод - это конвертирующий конструктор, который хорош, если его можно решить во время компиляции, если они конвертируемы. Например, если все классы можно преобразовать из шаблонного в Derived в шаблонный в Base, вот конструктор, который будет работать только тогда, когда это правда (используя enable_if и boost :: type_traits):
template <typename To>
class myclass {
//converting constructor
template <typename From>
myclass(const myclass<From>&,
typename enable_if<boost::type_traits::is_base_of<To, From> >::type* dummy = 0)
{ }
};