русский
Germany.ruForen → Архив Досок→ Programmierung

Вопрос про шаблоны. переменной в шаблоне?

104  
evgher постоялец11.07.07 11:21
evgher
11.07.07 11:21 
Zuletzt geändert 12.07.07 16:26 (evgher)
Никак не могу понять
Декларирую функцию:
friend Rational<T> operator + <T>(const Rational<T>&, const Rational<T>&);
в
template <class T>
class Rational{
T num, den;
public:
...
friend Rational<T> operator + <T>(const Rational<T>&, const Rational<T>&);
....
static const Rational one;
};
Компайлер выдаёт кучу дряни:
В ответ на:

usr/include/c++/3.3/bits/stl_iterator_base_types.h: In instantiation of `std::iterator_traits<int>':
Rational.h:33: instantiated from `std::reverse_iterator<int>'
Rational.h:33: instantiated from `Rational<int>'
Rational.cpp:17: instantiated from here
/usr/include/c++/3.3/bits/stl_iterator_base_types.h:126: error: `int' is not a
class, struct, or union type
..............................................

Стоит стереть Т в <T>
т.е.
вместо
friend Rational<T> operator + <T>(const Rational<T>&, const Rational<T>&);
будет
friend Rational<T> operator + <>(const Rational<T>&, const Rational<T>&);
В чём различие?
В следующей строке - всё работает в обоих случаях
friend std::ostream& operator << <Т>(std::ostream& , const Rational<T>&);
Существует ли возможность узнать
тип переменной следующим или похожим способом в С++?
template<class T>
void ClassName<T>::function(T a){
switch(T){
case int: ... break;
case rational: .... break;
case string: .... break:
default:
}
}
#1 
  Chipolino местный житель11.07.07 16:19
NEW 11.07.07 16:19 
in Antwort evgher 11.07.07 11:21
Для таких вещей придумали специализацию шаблонов .
#2 
kashej постоялец11.07.07 19:25
kashej
NEW 11.07.07 19:25 
in Antwort evgher 11.07.07 11:21
С помощью оператора dynamic_cast, но тогда зачем шаблонная функция. Ведь ее цель - выполнять одни и те же действия для разных типов ее параметров.
http://denis-aristov.ucoz.com
#3 
AlexNek свой человек11.07.07 22:15
AlexNek
NEW 11.07.07 22:15 
in Antwort evgher 11.07.07 11:21
Не могу додуматься для чего это может понадобится. Но можно наследовать класс для конкретной реализации и делать уже там различные действа. Иначе какой смысл в типозависимом шаблоне.
#4 
  Chipolino местный житель12.07.07 20:38
NEW 12.07.07 20:38 
in Antwort evgher 11.07.07 11:21
В ответ на:
friend Rational<T> operator + <T>(const Rational<T>&, const Rational<T>&);

<T> после operator + лишнее
В ответ на:
static const Rational one;

Не указан тип , напр Rational<int>
И зачем этот класс вообще делать шаблонным ?
#5