#include <iostream>
using namespace std;
template <typename T>
class rational;

template <typename T>
ostream& operator<<(ostream& o, const rational<T>& r);
template <typename T>
rational<T> operator+(rational<T> &r1, rational<T>& r2);
template <typename T>
rational<T> operator*(rational<T>& r1, rational<T>& r2);


template <typename T>
class rational {
public:
	T num;
	T denom;
	rational() {};
	rational(T num, T den);
	friend ostream& operator<<<>(ostream& o, const rational& r);
	friend rational operator+<>(rational& r1, rational& r2);
	friend rational operator*<>(rational& r1, rational& r2);

};
template <typename T>
rational<T>::rational(T num, T den) {
	this->num = num;
	this->denom = den;
}

template <typename T>
ostream& operator<<(ostream& o, const rational<T>& r) {
	o << r.num << "/" << r.denom;
	return o;
}
template <typename T>
rational<T> operator+(rational<T>& r1, rational<T>& r2) {
	rational<T> res;
	res.num = r1.num * r2.denom + r1.denom * r2.num;
	res.denom = r1.denom * r2.denom;
	return res;
};

template <typename T>
rational<T> operator*(rational<T>& r1, rational<T>& r2) {
		rational<T> res;
		res.num = r1.num * r2.num;
		res.denom = r1.denom * r2.denom;
		return res;
	};


int main()
{
	rational<int> r1(1, 3), r2(3, 4);
	rational<int> res = r1 * r2;
	cout << res << endl;
	return 0;
};

