문자열로의 암시적 변환을 사용하여 객체를 스트리밍하려고 하면 오버로드 해결 실패가 발생할 수 있습니다. 이는 문자열로의 암시적 변환과 객체를 표준 출력으로 스트리밍하는 함수를 사용하여 구조체를 정의하는 다음 코드로 설명됩니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!