2013-07-29 4 views
-3

템플릿 클래스를 오버로드하는 방법에 대해 궁금합니다. 내가 다음 수업을 듣는다면. T 복잡한 형태 인 경우 나,템플릿 클래스 오버로드

template <class T> 
void A<double>::print_data(){ 
    printf("%g",date); 
} 

: 나는 T 더블 타입 인 경우, 나는 다음 의사 코드와 같은 기능을 필요 T.

template <class T> 
class A { 
    T data; 
public: 
    void print_data(void); 
} 

의 다른 유형에 대해 서로 다른 기능을 만들려면 다음과 같이 작동해야합니다.

template <class T> 
void A< complex<double> >::print_data(){ 
    printf("%g+%gi",data.real(),date.imag()); 
} 

이 목표는 어떻게 달성해야합니까? 고맙습니다!

해결책을 찾았지만별로 좋지 않다고 생각합니다. 기본 개념은 오버로드에 입력 매개 변수를 사용하는 것입니다.

template <class T> 
class A { 
public: 
    T data; 
    void print_data(double); 
    void print_data(complex<T>);  
} 

template <class T> 
void A<T>::print_data(double){ 
    printf("%g",date); 
} 
template <class T> 
void A<T>::print_data(complex<T>){ 
    printf("%g+%gi",data.real(),date.imag()); 
} 

int main(void) 
{ 
    //just demonstrate the idea, may not work 
    A<double> ddata; 
    A<complex> cdata; 
    ddata.data = 2.0; 
    cdata.data = complex(1,2); 

    ddata->print_data(ddata); 
    cdata->print_data(cdata); 
    return 0; 
} 

누구에게 더 좋은 해결책이 있습니까?

+0

는 당신이 시도 해 봤나? (함수 반환 형식을 잊지 마세요!) –

+0

Skippy하려면 print_data() 함수를 만들고 싶습니다. 내가 여기서주고있는 것은 잘못이다, 그들은 단지 내가 얻고 싶은 것을 보여주고있다. – lengfei

+0

David에게 : 예, 위 코드를 반환 유형으로 시도했지만 컴파일 오류가 발생합니다. – lengfei

답변

1

그냥 콘크리트 종류의 템플릿 기능을 전문 :

template <> 
void A<double>::print_data() 
{ 
    std::cout << data << std::endl; 
} 
template<> 
void A<complex<double> >::print_data(){ 
    std::cout << data.real() << "+" << data.imag() << std::endl; 
} 
+0

이 솔루션을 사용하면 템플릿의 전문화 과정에서 공통적으로 나타나는 모든 것을 다시 정의해야합니다. –

관련 문제