> 백엔드 개발 > C++ > Person 개체를 문자열로 암시적으로 변환하면 과부하 해결이 실패하는 이유는 무엇입니까?

Person 개체를 문자열로 암시적으로 변환하면 과부하 해결이 실패하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-05 11:11:02
원래의
575명이 탐색했습니다.

Why Does Implicit Conversion of a Person Object to a String Result in Overload Resolution Failure?

객체를 문자열로 암시적으로 변환하는 동안 오버로드 해결 실패

암시적 문자열 변환은 일반적으로 권장되지 않으며 Person에 대한 연산자 오버로드가 더 적절한 솔루션입니다. 그러나 문제를 설명하기 위해 다음 코드를 검토해 보겠습니다.

<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; // Error occurs here
}</code>
로그인 후 복사

GCC 4.3.4를 사용할 때 코드는 오류 없이 컴파일되어 다음과 같은 출력을 제공합니다.

<code class="Bash">bobble
wibble</code>
로그인 후 복사

그러나 <<를 사용하여 암시적으로 Person 객체를 문자열로 변환합니다. 오버로드 해결 오류로 인해 연산자가 실패합니다.

<code class="Bash">prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’</code>
로그인 후 복사

이 경우 연산자 << std::string 및 const char*를 처리하기 위해 오버로드되었지만 Person 개체를 허용하고 이를 암시적으로 문자열로 변환하는 미리 정의된 오버로드는 없습니다. 결과적으로 컴파일러는 오버로드를 해결하지 못합니다.

이 문제를 해결하려면 명시적인 연산자 << Person 구조체를 friend 함수로 사용하면 Person 개체에서 문자열로의 암시적 변환이 올바르게 작동할 수 있습니다.

위 내용은 Person 개체를 문자열로 암시적으로 변환하면 과부하 해결이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿