암시적 문자열 변환은 일반적으로 권장되지 않으며 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!