2011-02-08 3 views
81

하나의 인수를 가진 템플릿 함수가 있습니다. 이 함수를 호출하지 않고 해당 함수를 인스턴스화해야한다는 것은 명시 적으로 인스턴스화해야 함을 의미합니다.템플릿 함수를 명시 적으로 인스턴스화하는 방법은 무엇입니까?

나는이 기능을 가지고 :

template int function_name<int>(int); 

하지만 다음과 같은 오류가있어 :

error: expected primary-expression before 'template' 
error: expected `;' before 'template' 

답변

130

[수정 2] : 참고 나는이 같은 해당 기능을 인스턴스화

template <class T> int function_name(T a) {} 

코드 서식 문제로 인해 원래 질문에 코드와 관련하여 혼란이있었습니다. 자세한 내용은 AnthonyHatchkins의 답변을 참조하십시오.

당신이 정말로 기능 (대신 전문인 뭔가) 인스턴스화하려면 다음을 수행

template <typename T> void func(T param) {} // definition 

template void func<int>(int param); // explicit instantiation. 

[편집]을 명시 적 인스턴스화 및 전문화에 대한 혼란 (많은)이있는 것 같습니다. 위 코드는 명시 적 인스턴스화을 다룹니다. 전문화의 구문이 다릅니다. 여기 전문화를위한 구문입니다

template <typename T> void func(T param) {} // definition 

template <> void func<int>(int param) {} // specialization 

참고 템플릿 후 그 꺾쇠 괄호!

+2

* 인스턴스화 * 또는 * 전문화 *? – Nawaz

+1

이것은 인스턴스화입니다. – hrnt

+0

@hrnt : 컴파일러 * 템플릿을 "인스턴스화"* 프로그래머 만 * "전문화"*합니다. 인스턴스화는 컴파일러에 의해 템플릿에서 특수화를 만드는 행위입니다! – Nawaz

16

코드가 정확합니다.

오류 메시지는 여기에 인용하지 않은 코드의 위치와 관련이 있습니다.

는 업데이트 :

원래 코드는

template <class T> int function_name(T a) {} 
template int function_name<int>(int); 

이었고, 그것은 정확했다. 그것은 다음과 같은 오류 영업 이익은 인용 것과 분명히 다른

a.cpp:1: error: explicit instantiation of non-template ‘int function_name’ 
a.cpp:1: error: expected `;' before ‘(’ token 
a.cpp:3: error: ‘function_name’ is not a template function 

를 생성

template int function_name(T a) {} 
template int function_name(int); 

:

그러나 그것이 인용되지 않았으며, 따라서 이 같은을 보였다.

이 변형에서 두 번째 줄은 괜찮습니다 (<int>는 여기에서 생략 할 수 있음). 첫 번째 줄에는 오류가 있습니다. 컴파일러는 T이 템플릿 매개 변수라고 추측 할 수 없습니다.

+0

원래 코드는'template int function_name (T a) {}'와'template int function_name (int);입니다. – hrnt

+0

@hrnt 원본 코드가 아직 올바르게 포맷되지 않았습니다. 그것은 옳았다. 내가 __Balaji__라면, 그가 유용하다고 생각한다면 답장을하고 받아 들일 것입니다. 그러나 나에게 (그리고 아마도 다른 누구에게나) 당신의 대답은 (그 자체로 완벽하지만) 질문에 대답하지 않습니다. –

+0

@hrnt 당신은 원래 코드가 그렇게 보인 것이 맞습니다. 그러나 추론 된 템플릿 인수로 인해 여전히 작동합니다. Antony Hatchkins와 동의해야합니다. OP에서 인용하지 않은 코드에서 오류가 발생하지만, 사용자의 대답은 명시 적 인스턴스화에 대해 잘 모르는 사람들에게 유용하다고 생각합니다. – mpark

관련 문제