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

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

이 기능이 있습니다.

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

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

template int function_name<int>(int);

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

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


답변

[편집 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

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


답변

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

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

최신 정보:

원래 코드는

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는 이것이 템플릿 매개 변수 라고 추측 할 수 없습니다 .


답변