>  기사  >  백엔드 개발  >  C에서 `std::string`으로의 암시적 변환으로 인해 오버로드 해결이 실패하는 이유는 무엇입니까?

C에서 `std::string`으로의 암시적 변환으로 인해 오버로드 해결이 실패하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-06 06:26:02585검색

Why Does Overload Resolution Fail with Implicit Conversion to `std::string` in C  ?

암시적 변환 시 오버로드 해결 실패

문자열로의 암시적 변환을 사용하여 객체를 스트리밍하려고 하면 오버로드 해결 실패가 발생할 수 있습니다. 이는 문자열로의 암시적 변환과 객체를 표준 출력으로 스트리밍하는 함수를 사용하여 구조체를 정의하는 다음 코드로 설명됩니다.

<code class="cpp">#include <string>
#include <ostream>
#include <iostream>

struct NameType {
   operator std::string() { return "wobble"; }
};

struct Person {
   NameType name;
};

int main() {
   std::cout << std::string("bobble");
   std::cout << "wibble";

   Person p;
   std::cout << p.name;
}</code>

GCC 4.3.4로 컴파일하면 이 코드는 다음을 생성합니다. 다음 오류:

prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’

이 오류는 자유 함수 연산자<<(ostream&, string const&)가 오버로드 세트에서 고려되지 않기 때문에 발생합니다. 이는 템플릿 인스턴스화인 원하는 오버로드와 ADL(인수 종속 조회)의 조합 때문입니다.

C 98 표준 섹션 14.8.1/4에서는 이를 변환하기 위해 함수 인수에 대해 암시적 변환이 수행된다고 명시합니다. 매개변수 유형에 템플릿 인수 추론에 참여하는 템플릿 매개변수가 포함되어 있지 않은 경우에만 해당 함수 매개변수의 유형에 적용됩니다. 이 경우 원하는 오버로드에 대한 모든 인수에는 템플릿 인수 추론에 참여하는 템플릿 매개 변수가 포함되어 있으므로 그 중 어느 것도 암시적 변환에서 해당 값을 얻을 수 없습니다.

따라서 오버로드 해결이 실패하고 오류가 보고되었습니다.

위 내용은 C에서 `std::string`으로의 암시적 변환으로 인해 오버로드 해결이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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