> 백엔드 개발 > C++ > 본문

## 템플릿 기본 클래스를 사용한 다중 상속으로 인해 멤버 함수 결정이 모호해지는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-25 04:58:02
원래의
529명이 탐색했습니다.

## Why Does Multiple Inheritance with Template Base Classes Cause Ambiguity in Member Function Resolution?

다중 상속 명확성의 모호성

템플릿 기본 클래스를 사용하여 다중 상속을 처리할 때 모호한 멤버 함수 해결과 관련된 잠재적인 문제가 발생합니다. 다음 시나리오를 고려하십시오.

<code class="cpp">template <typename ... Types>
class Base {
public:
  template <typename T>
  typename std::enable_if<Contains<T, Types ...>::value>::type foo() {
    std::cout << "Base::foo()\n";
  }
};
로그인 후 복사

여기서 foo() 함수는 템플릿 매개변수가 Types 팩의 유형 중 하나와 일치하는 경우에만 호출 가능합니다. 이제 파생 클래스가 겹치지 않는 유형 집합이 있는 여러 기본 클래스에서 상속되는 경우 컴파일러는 foo() 호출을 해결할 때 모호성을 경험할 수 있습니다.

<code class="cpp">struct Derived: public Base<int, char>,
                public Base<double, void>
{};</code>
로그인 후 복사

이 경우 Derived() 호출입니다. foo()는 이상적으로 Base에서 foo() 멤버 함수를 호출합니다. 그러나 GCC와 Clang 모두 모호성을 보고합니다.

컴파일러가 모호성을 해결할 수 없는 이유

컴파일 오류는 멤버 함수 조회에 대한 병합 규칙으로 인해 발생합니다. C 표준에 따르면 파생 클래스 자체에 멤버 함수가 선언되지 않은 경우 조회 프로세스는 기본 클래스를 차례로 검색합니다. 그러나 기본 클래스의 선언 세트가 다르면 병합이 모호해집니다.

주어진 시나리오에서 파생 클래스 Derived는 foo()를 명시적으로 선언하지 않으므로 컴파일러는 두 개의 기본 클래스. 기본 클래스에는 foo()에 대한 서로 다른 선언 세트가 포함되어 있으므로 병합으로 인해 모호성이 발생합니다.

솔루션

이 모호성을 해결하기 위한 한 가지 옵션은 using 선언을 사용하는 것입니다. 파생 클래스에서 원하는 멤버 함수를 명시적으로 가져옵니다. 그러나 이를 위해서는 사용자가 이러한 선언을 추가해야 하며, 이는 큰 유형 목록의 경우 장황하고 비실용적일 수 있습니다.

<code class="cpp">struct Derived: public Base<int, char>,
                public Base<double, void>
{
    using Base<int, char>::foo;
    using Base<double, void>::foo;
};</code>
로그인 후 복사

또는 모든 기본 클래스에서 멤버 함수를 수집하고 병합하는 도우미 클래스를 사용할 수 있습니다. , 파생 클래스가 직접 액세스할 수 있도록 허용합니다.

<code class="cpp">template <typename... Bases>
struct BaseCollector : Bases...
{
  using Bases::foo...;
};

struct Derived : BaseCollector<Base<int, char>, Base<double, void>>
{};</code>
로그인 후 복사

이 접근 방식을 사용하면 사용자는 모호성을 해결하기 위해 추가 선언을 추가할 필요가 없습니다. BaseCollector 클래스는 모든 기본 클래스의 선언 세트를 효과적으로 병합하여 모호함 없이 파생 클래스에서 foo() 함수를 사용할 수 있도록 합니다.

위 내용은 ## 템플릿 기본 클래스를 사용한 다중 상속으로 인해 멤버 함수 결정이 모호해지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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