>백엔드 개발 >C++ >C에서 암시적 유형 변환 시 템플릿 인수 추론이 실패하는 이유는 무엇입니까?

C에서 암시적 유형 변환 시 템플릿 인수 추론이 실패하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-28 07:05:02687검색

Why Does Template Argument Deduction Fail with Implicit Type Conversions in C  ?

템플릿 인수 추론 및 암시적 유형 변환

C에서 템플릿 인수 추론은 템플릿 매개변수의 유형을 기반으로 자동 결정하는 강력한 기능입니다. 발신자의 주장에 대해. 그러나 사용자 정의 변환을 포함하여 특정 유형의 변환은 추론 중에 고려되지 않습니다.

암시적 변환 문제

다음 코드 조각을 고려하세요.

<code class="cpp">template<typename Dtype>
class Scalar{
    Scalar(Dtype v) : value_(v){}
private:
    Dtype value_;
};</code>

Scalar 클래스는 간단한 값 유형을 나타냅니다. 이제 다음 템플릿 함수를 고려해 보세요.

<code class="cpp">template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
    cout << "ok" <<endl;
}</code>

이 함수는 int와 Scalar 객체를 인수로 사용합니다.

다음 기본 함수에서는 int 및 int 값을 사용하여 func를 호출하려고 합니다.

<code class="cpp">int main(){
    int a = 1;
    func(a, 2); // ERROR: template argument deduction fails
    return 0;
}</code>

그러나 이로 인해 템플릿 오류가 발생한다는 컴파일 오류가 발생합니다. 인수 추론에 실패했습니다. 이는 컴파일러가 int 값 2를 Scalar 물체. Scalar::Scalar(Dtype 값)과 같은 사용자 정의 변환은 템플릿 인수 추론 중에 고려되지 않습니다.

가능한 해결 방법

수정하려면 이 문제에는 여러 가지 옵션이 있습니다.

  • 발신자 사이트의 명시적 변환:

    <code class="cpp">func(a, Scalar<int>(2));</code>

    이것은 수동으로 int 값을 스칼라(<)로 변환합니다. ;정수> func에 전달하기 전에 개체를 지정하세요.

  • 추론 가이드:(C 17에만 해당)
    Scalar에 대한 추론 가이드 추가:

    <code class="cpp">template<typename T>
    Scalar(T v) -> Scalar<T>;</code>

    이는 호출자의 인수에서 Scalar 유형을 추론할 때 컴파일러가 이 추론 가이드를 선호하도록 지시하여 다음과 같이 func를 호출할 수 있도록 합니다.

    <code class="cpp">func(a, 2);</code>
  • 명시적 인스턴스화:
    특정 유형에 대해 func를 명시적으로 인스턴스화할 수 있습니다.

    <code class="cpp">func<int>(a, 2);</code>

    이렇게 하면 컴파일러가 Dtype = int로 함수를 인스턴스화하여 템플릿 인수 추론의 필요성을 피할 수 있습니다.

위 내용은 C에서 암시적 유형 변환 시 템플릿 인수 추론이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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