수색…


비고

  • 동일한 이름, 동일한 유형에도 불구하고 일반 함수는 함수 템플리트와 관련이 없습니다.
  • 일반 함수 호출과 생성 된 함수 템플릿 호출은 동일한 이름, 동일한 반환 유형 및 동일한 인수 목록을 공유하더라도 서로 다릅니다.

유효한 함수 템플릿 오버로드 란 무엇입니까?

함수 템플리트는 템플리트가 아닌 템플리트 오버로드 (동일한 이름이지만 다른 매개 변수 유형)에 대한 규칙에 의해 오버로드 될 수 있으며, 그 외에도 오버로드는 if

  • 반환 유형이 다르거 나
  • 템플릿 매개 변수 목록은 매개 변수의 이름 지정과 기본 인수의 존재를 제외하고는 다릅니다 (서명의 일부가 아닙니다)

일반적인 함수의 경우 두 가지 매개 변수 유형을 비교하는 것은 컴파일러가 모든 정보를 가지고 있기 때문에 쉽습니다. 그러나 템플리트 내의 유형은 아직 결정되지 않을 수 있습니다. 따라서 두 매개 변수 유형이 동일한 경우에 대한 규칙은 여기에 근사치이며 종속되지 않은 유형 및 값이 일치해야하며 종속 유형 및 표현식의 철자가 동일해야한다고 설명합니다 (더 정확히 말하자면, 소위 ODR- 규칙). 단, 템플릿 매개 변수의 이름이 바뀔 수 있습니다. 그러나 이와 같이 다른 철자를 사용하면 해당 유형의 두 값이 다르게 간주되지만 항상 동일한 값으로 인스턴스화됩니다. 오버로드는 유효하지 않지만 컴파일러에서 진단을 요구하지는 않습니다.

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

"T"와 "T *"는 다른 철자이므로 유효한 과부하입니다. 그러나 다음은 무효이며 진단 필요 없음

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow