2013-05-31 1 views
3

다음 코드를 참조하십시오. 첫 번째 MyClass <>에는 두 가지 기능 (func1 및 func2)이 있습니다. 그렇다면 func1에서는 MyClass에 대해 특별한 일을하고 싶지만 func2에서는 그렇지 않습니다. func2에 대한 코드를 다시 입력해야하는 것처럼 보입니다. 이 문제를 해결할 방법이 있는지 궁금합니다. 감사합니다템플릿 전문화 : 특수 사례를 부분적으로 구현할 수 있습니까?

#include <iostream> 

using namespace std; 

template <class T> 
class MyClass { 
public: 
    void func1(){ 
    cout<<"default: func1"<<endl; 
    } 
    void func2(){ 
    cout<<"default: func2"<<endl; 
    } 
private: 
    T haha; 
}; 

template <> 
class MyClass<double> { 
public: 
    void func1(){ 
    cout<<"special: func1"<<endl; 
    } 
}; 

int main() 
{ 
    MyClass<int> intclass; 
    intclass.func1(); 
    intclass.func2(); 

    MyClass<double> doubleclass; 
    doubleclass.func1(); 
    doubleclass.func2(); // error 'class MyClass<double>' has no member named 'func2' 
    return 0; 
} 

답변

4

전체 클래스에 대한 전문화를 제공 할 필요는 없습니다.

template <> 
void MyClass<double>::func1() { 
    cout<<"special: func1"<<endl; 
} 

라이브 데모 here : 당신은 특정 멤버 함수를 전문으로 할 수 있습니다.

+0

감사합니다. 이 예제에서 작동합니다. 그러나 제 작업 예제에서는 템플릿 부분이 먼저 정적 라이브러리를 작성하는 데 사용되며 컴파일러는 복제 된 정의에 대해 불만을 제기합니다. 더 이상의 코멘트? –

+0

@ YanZhu는 전문화를 '인라인'으로 만듭니다. – mfontanini

+0

감사합니다. 그것은 연결을 전달합니다. 이것의 뒤에 어떤 이론? 이것에 대한 몇 가지 기사를 가르쳐 주시겠습니까? 나는 구글을 시도했지만 유용한 것들을 찾을 수 없다. –