문자열로의 암시적 변환을 통해 객체를 스트리밍할 때 오버로드 해결 실패
문제 설명
암시적 문자열로의 변환은 일반적으로 권장되지 않으며, 대신 사용자 정의 유형에 대한 출력 연산자(<<)를 오버로드하는 것이 권장되는 접근 방식입니다. 그러나 암시적 변환 및 객체 스트리밍과 관련된 코드는 오버로드 해결 모호성을 초래할 수 있습니다.
다음 예를 고려하세요.
<code class="cpp">struct NameType { operator std::string() { return "wobble"; } }; struct Person { NameType name; }; int main() { std::cout << "bobble"; std::cout << "wibble"; Person p; std::cout << p.name; }</code>
오류 메시지
GCC 4.3.4로 이 코드를 컴파일하면 다음 오류가 발생합니다.
prog.cpp: In function ‘int main()’: prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’
근본 원인
오버로드 세트에 다음 요소의 조합으로 인해 원하는 오버로드가 포함되지 않습니다. 요인:
ADL 제한
인수에 따라 다름 조회(ADL)는 이 문제와 직접적인 관련이 없습니다. ADL은 컴파일러가 함수 호출을 확인할 때 적용되는 컴파일 타임 기능입니다. 이 경우, 함수 호출 없이 컴파일러에 의해 문자열로의 암시적 변환이 수행됩니다.
위 내용은 문자열로의 암시적 변환을 통해 개체를 스트리밍하면 오버로드 해결이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!