2011-11-10 3 views
4

나는 템플릿 전문화를 이해하려고 노력해 왔습니다. 왜 이런 오류 (specialization of 'T foo(T, T) [with T = int]' after instantiation)를 생성한다C에서 템플릿 전문화

template <class T> T foo(T a, T b); 

int main() 
{ 
    int x=34, y=54; 
    cout<<foo(x, y); 
} 

template <class T> T foo(T a, T b) 
{ 
    return a+b; 
} 

template <> int foo<int>(int a, int b) 
{ 
    cout<<"int specialization"; 
} 
+1

그냥 main''전에 정의를 이동합니다. –

+1

내 안드로이드 폰으로 질문을하는 중에 비가 내리고 앉을 수는 있지만 할 수 없다. 시간에 대답을한다. –

+1

@ JohannesSchaub-litb 너는 중독된다 !! 도움을 구하다 ;) –

답변

8

모든 템플릿 정의 인스턴스의 시간에 알려진해야하는 표준 요구 사항을, 모든 번역 단위가 동일한 정의를 참조한다 :

잘 작동합니다 다음. 그렇지 않으면 프로그램이 잘못 구성되어 있습니다 (실제로 진단이 필요하지 않습니다).

는 (그래서이 문제를 해결하기 위해, 단지 프로그램의 상단에 모든 템플릿 정의를 넣어.)

그 템플릿 함수는 단지 템플릿, 기능하지 않습니다 기억하십시오. 그것들을 코드 생성 도구라고 생각하십시오.

3

이/인스턴스화를 호출 할 수 있습니다 전에 기능 foo()이 볼 수 있어야합니다 명시 적으로 전문 템플릿입니다.

실제로 위의 규칙은 모든 템플릿 기능에 적용됩니다.

솔루션 :
main() 이전 foo()에 대한 템플릿 특수화를 이동 .

template <class T> T foo(T a, T b); 

/*Should be visible before instantiation*/ 
template <> int foo<int>(int a, int b) 
{ 
    cout<<"int specialization"; 
} 

int main() 
{ 
    int x=34, y=54; 
    cout<<foo(x, y); 
} 

template <class T> T foo(T a, T b) 
{ 
    return a+b; 
} 
0

하지 마십시오.

는 허브 셔터 말했다 무엇 :

당신이 함수의 기본 템플릿을 작성하는 경우는, 전문하거나 에 과부하가 결코해야 하나의 기능 템플릿으로 작성한 다음 함수 템플릿을 구현하는 것을 선호 전체적으로는 과 같은 서명을 가진 정적 함수를 포함하는 클래스 템플릿에 대한 간단한 핸드 오프로서 .

참조 : http://www.gotw.ca/publications/mill17.htm