Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Задача с двумя параметризованными классами |
Автор: AlexKar 7.12.2005, 19:08 |
Как реализовать такую задачу? Есть два параметризованных класса: template <class T> class A{ --------- private: T width; }; template <class T> class B{ --------- private: T width; }; Надо перегрузить оператор присваивания таким образом, чтобы можно было выполнить следующее: int main(void); /* T1 и T2 - определенные типы, например int и float */ A<T1> a; B<T2> b; a=b; // Надо выполнить эти операции присваивания b=a; return 0; } Когда T1==T2 тогда все понятно: template <class T> class A{ public: --------- void operator = (const B<T>&); private: T width; }; template <class T> void A<T>::operator = (const B<T>& rhs){ this->width=rhs.width; } Аналогично перегружаем = в классе B, но что делать, если T1!=T2, как тогда перегрузить оператор = ? template <class T> class A{ public: --------- template <class N> void operator = (const B<N>&); private: T width; }; template <class T,class N> void A<T>::operator = (const B<N>& rhs){ this->width=rhs.width; } Над такой записью компилятор ругается, есть ли у вас какие-либо варианты;) |
Автор: blackofe 7.12.2005, 19:51 | ||
AlexKar вот такое компилится и работает:
выдает на выходе: a.width = 10 b.width = 20 a.width = 20 b.width = 20 a.width = 20 b.width = 20 Press any key to continue то, что тебе нужно? кстати, тебе только нужно позаботиться о возможности преобразования T в N и обратно. я выбрал int и long - понятно, что компилятор сделает необходимые приведения. |
Автор: Earnest 8.12.2005, 20:02 | ||||||||
... позаботится об этом тоже можно как-нибудь погибчее. Например, так:
Соответственно, в коде оператора присваивания от blackofe вместо
Для тривиальных случаев сойдет стандартная реализация type_cast, для более сложных - пишем необходимые специализации... |
Автор: blackofe 8.12.2005, 20:40 |
Earnest примерно это я и имел в виду. |