멤버함수 템플릿 operator*가 제대로 컴파일 되지 않습니다.

dltkddyd의 이미지

*연산자를 외부로 빼서 정의해서 컴파일 하면 계속 컴파일 오류가 뜹니다. 소스는 다음과 같은데요.

//-test6.h-
template<class T>
class Rational {
public:
	int numerator;
	int denominator;
	Rational(int _numerator, int _denominator);
	Rational(const Rational<T>& right);
	/*template<class R=T>
	const Rational<R> operator*(const Rational<R>& right) {
		return Rational<R>(numerator*right.numerator, denominator*right.denominator);
	}*/
	template<class R=T>
	const Rational<R> operator*(const Rational<R>& right) {};
};
 
template<class T> Rational<T>::Rational(int _numerator=0, int _denominator=1):numerator(_numerator),denominator(_denominator) {}
template<class T> Rational<T>::Rational(const Rational<T>& right):numerator(right.numerator),denominator(right.denominator) {}
 
template<class T>
template<class R=T>
const Rational<R> Rational<T>::operator*(const Rational<R>& right) {
	return Rational<R>(numerator*right.numerator, denominator*right.denominator);
}
//바로 위의 템플릿 멤버함수에서  컴파일이 안 됩니다.
-test6.cc-
#include <iostream>
using namespace std;
#include "test6.h"
int main() {
	Rational<int> obj1(4,5);
	//Rational<int> obj2=obj1*3;
	//cout<<obj2.numerator<<"  "<<obj2.denominator<<endl;
 
	//obj1*3;
	return 0;
}

dltkddyd의 이미지

클래스 안의 선언부에서
template
const Rational operator*(const Rational& right) {};

아니라

template
const Rational operator*(const Rational& right);

군요.

그래도 역시 컴파일 에러가 나서 다시 다음과 같이 수정하고 컴파일 하니 오류가 안 나네요.

template
template
const Rational Rational::operator*(const Rational& right) {
return Rational(numerator*right.numerator, denominator*right.denominator);
}

그런데 T와 R이 같도록 하려면 어떻게 해야 하죠?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.