템플릿 함수를 어떻게 명시 적으로 인스턴스화합니까?


117

하나의 인수가있는 템플릿 함수가 있습니다. 그 함수를 호출하지 않고 그 함수를 인스턴스화해야한다는 것은 명시 적으로 인스턴스화해야 함을 의미합니다.

이 기능이 있습니다.

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

이 함수를 다음과 같이 인스턴스화했습니다.

template int function_name<int>(int);

하지만 다음과 같은 오류가 있습니다.

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

답변:


182

[편집 2] : 코드 서식 문제로 인해 원래 질문의 코드와 관련하여 약간의 혼동이있었습니다. 자세한 내용은 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

템플릿 뒤에 꺾쇠 괄호가 있습니다!


3
인스턴스 또는 전문화 ?
Nawaz

5
사실이 아니다. 컴파일러에게 템플릿을 명시 적으로 인스턴스화하도록 지시 할 수 있습니다. 자세한 내용은 "C ++ 명시 적 템플릿 인스턴스화"를위한 Google.
hrnt 2008

8
@Nawaz : 당신이 틀렸어요. 물론 인스턴스화하는 것은 항상 컴파일러이고, 그 행은 템플릿을 인스턴스화하기 위해 프로그래머가 컴파일러로 보내는 요청입니다. C ++ 표준의 사본이있는 경우 14.7.2 명시 적 인스턴스화
David Rodríguez-dribeas

16
전문화는 아마도 구현을 변경하고 있음을 의미합니다. 인스턴스화는 단순히 특정 컴파일 단위에 할당하는 것을 의미합니다. 고유 주소를 사용하거나 라이브러리 함수로 사용 가능하게하거나 부풀림을 줄이기 위해 가능합니다.
CashCow

3
@hrnt : 제 생각에, 당신 말이 맞아요. @Ashot : 방금 구문에 template<>형식 이 없다는 것을 알았습니다 . 그가 쓴 내용은 전문화 와 다릅니다 . 이 새로운 것을 가르쳐 준 +1. 내 게시물을 제거하고 있습니다. : D
Nawaz

20

귀하의 코드가 정확합니다.

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

최신 정보:

원래 코드는

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

그리고 그것은 옳았습니다.

그러나 인용되지 않았으므로 다음과 같이 보입니다 .

template int function_name(T a) {}
template int function_name(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

OP가 인용 한 것과는 분명히 다릅니다.

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


기술적으로는 자신의 코드 아니었다, 그것은 빌의 편집 : 원래 코드는했다 template int function_name( T a) { }template int function_name(int);
hrnt

@hrnt 원본 코드가 올바르게 형식화되지 않았지만 정확했습니다. 내가 Balaji 라면 그가 유용하다고 생각하면 답장을 받고 받아 들일 것이지만, 나에게 (그리고 아마도 다른 사람에게도) 당신의 대답은 그 질문에 대한 답이 아닙니다.
Antony Hatchkins 2014 년

@hrnt 원래 코드가 그렇게 생겼다는 말이 맞습니다. 그러나 추론 된 템플릿 인수 때문에 여전히 작동합니다. 나는 OP가 인용하지 않은 코드에서 오류가 발생한다는 Antony Hatchkins에 동의해야하지만, 귀하의 답변은 명시 적 인스턴스화에 대해 알지 못하는 사람들에게 여전히 유용하다고 생각합니다.
mpark 2014 년

예를 들어 보겠습니다. 명시 적 인스턴스화에 대한 잘 잊혀진 지식을 새로 고치고 싶을 때이 페이지를 검색했는데 그다지 도움이되지 않았습니다. 저에게는 구문에 대한 혼란이 없습니다. 어떤 명시 적 인스턴스에 대한 혼란이 발생할 수 있습니다 자사의 사용법입니다
안토니 Hatchkins

@AntonyHatchkins 아, 사실-원래 질문의 출처를 보지 않고 화면에 어떻게 나타 났습니까? 나는 이것을 +1하고 원래 질문과 관련된 혼란을 메모하기 위해 원래 답변을 수정합니다.
hrnt 2014.01.09
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.