>백엔드 개발 >C++ >인수 종속 조회가 C에서 명시적 템플릿 인수가 있는 함수 템플릿을 찾지 못하는 이유는 무엇입니까?

인수 종속 조회가 C에서 명시적 템플릿 인수가 있는 함수 템플릿을 찾지 못하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-09 05:42:10915검색

Why Does Argument Dependent Lookup Fail to Find Function Templates with Explicit Template Arguments in C  ?

C의 인수 종속 조회 및 함수 템플릿

ADL(인수 종속 조회)은 컴파일러가 식별자를 검색할 수 있도록 하는 언어 기능입니다. 함수 호출의 인수와 연관된 네임스페이스 내. ADL은 일반적으로 함수를 찾지만 일부 시나리오에서는 함수 템플릿을 찾지 못합니다.

C 표준 설명

C 표준(2003)의 섹션 14.8.1.6에 나와 있습니다. that:

"그러나 명시적 템플릿 인수가 있는 함수 템플릿을 사용하면 호출의 구문 형식이 올바르지 않습니다. 호출 시점에 해당 이름이 표시되는 함수 템플릿이 없으면 호출은 구문적으로 올바른 형식이 아니며 인수 종속 조회가 적용되지 않습니다."

다음 예를 고려하세요.

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&amp;) {}
    void non_template(foo const&amp;) {}
}

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}

main의 마지막 호출 (frob(f);)는 호출 범위에 frob라는 이름의 함수 템플릿이 표시되지 않기 때문에 컴파일에 실패합니다. ADL이 frob<0>을 찾을 수 없습니다. 함수 템플릿은 컴파일러 구문에 의해 유효한 함수 호출로 간주되지 않기 때문입니다.

추가 고려 사항

  • 간단한 함수 이름(템플릿 인수 없이)의 경우 ADL은 여전히 이름이 표시되지 않더라도 함수 템플릿을 찾습니다.
  • 그러나 명시적인 템플릿 인수를 사용하여 함수 템플릿을 호출하면 함수 ADL이 성공하려면 해당 특정 이름을 가진 템플릿이 호출 범위에 표시되어야 합니다.
  • 경우에 따라 선언을 사용하면 함수 템플릿이 표시되어 ADL이 이를 찾을 수 있습니다.

위 내용은 인수 종속 조회가 C에서 명시적 템플릿 인수가 있는 함수 템플릿을 찾지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.