>  기사  >  백엔드 개발  >  사용자 정의 변환에서 템플릿 인수 추론이 실패하는 이유는 무엇입니까?

사용자 정의 변환에서 템플릿 인수 추론이 실패하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-27 16:20:29386검색

 Why Does Template Argument Deduction Fail with User-Defined Conversions?

템플릿 인수 추론 및 사용자 정의 변환

C 템플릿 프로그래밍에서 일반적인 작업은 한 유형의 값을 다른 유형의 인수를 기대하는 템플릿 함수입니다. 이를 용이하게 하기 위해 컴파일러는 실제 인수 유형에 따라 템플릿 인수를 자동으로 유추할 수 있는 TAD(템플릿 인수 추론)를 제공합니다.

템플릿 인수 추론의 한계

그러나 TAD에는 한계가 있습니다. 한 가지 제한 사항은 사용자 정의 변환을 고려하지 않는다는 것입니다. 즉, 한 유형에서 다른 유형으로의 사용자 정의 변환이 있는 경우 TAD는 템플릿 인수를 추론하기 위해 해당 변환을 적용하지 않습니다.

사례 연구

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

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

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

int main(){
  int a = 1;
  func(a, 2); // Error
}

이 코드에는 정수 a와 일부 유형 Dtype의 Scalar 객체라는 두 개의 인수를 취하는 템플릿 함수가 있습니다. 기본 함수에서는 정수 a와 정수 2를 전달하여 func를 호출하려고 합니다. 그러나 이는 컴파일 오류로 인해 실패합니다.

test.cpp: In function ‘int main()’:
test.cpp:32:12: error: no matching function for call to ‘func(int&, int)’
   func(a, 2);
            ^
test.cpp:32:12: note: candidate is:
test.cpp:25:6: note: template<class Dtype> void func(int, Scalar<Dtype>)
 void func(int a, Scalar<Dtype> b){
      ^
test.cpp:25:6: note:   template argument deduction/substitution failed:
test.cpp:32:12: note:   mismatched types ‘Scalar<Dtype>’ and ‘int’
   func(a, 2);</code>

TAD가 실패하는 이유

실패 이유는 TAD가 int에서 Scalar로 사용자 정의 변환을 적용할 수 없기 때문입니다. 이 작업을 수행하려면 호출자 사이트에서 인수를 명시적으로 변환하거나 Scalar에 대한 추론 가이드를 정의해야 합니다.

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

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