>백엔드 개발 >C++ >C 파생 클래스에서 CRTP 및 Typedef를 사용할 때 컴파일 시간 오류를 어떻게 해결할 수 있습니까?

C 파생 클래스에서 CRTP 및 Typedef를 사용할 때 컴파일 시간 오류를 어떻게 해결할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-06 17:53:12879검색

How Can We Address Compile-Time Errors When Using CRTP and Typedef in C   Derived Classes?

C 파생 클래스의 정적 다형성 및 Typedef 사용

C의 강력한 기능 중 하나인 CRTP(Curiously Recurring Template Pattern)는 정적 다형성을 가능하게 합니다. 이를 통해 템플릿 인수를 기반으로 생성된 개체 유형을 결정할 때 컴파일 타임 유연성이 가능해집니다. 그러나 파생 유형을 기반으로 함수 반환 유형을 수정할 수 있도록 CRTP를 확장하면 문제가 발생합니다.

CRTP를 일반화하려고 시도하는 다음 코드를 고려하세요.

template <typename derived_t>
class base {
public:
    typedef typename derived_t::value_type value_type;
    value_type foo() {
        return static_cast<derived_t*>(this)->foo();
    }
};

template <typename T>
class derived : public base<derived<T>> {
public:
    typedef T value_type;
    value_type foo() {
        return T();
    }
};

이 코드는 컴파일에 실패합니다. 오류로 인한 Microsoft Visual Studio 2010: 'value_type'은(는) 구성원이 아닙니다. 'derived'.

문제는 파생 항목이 기본 클래스 목록에서 기본에 대한 템플릿 인수로 사용될 때 불완전하다는 사실에서 발생합니다. 이 문제를 해결하기 위한 일반적인 해결 방법은 특성 클래스 템플릿을 사용하는 것입니다.

base_traits 템플릿 소개:

template <typename derived_t> 
struct base_traits;

특성을 사용하여 기본 클래스 재정의:

template <typename derived_t> 
struct base { 
    typedef typename base_traits<derived_t>::value_type value_type;
    value_type base_foo() {
        return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this));
    }
};

파생을 위한 base_traits 전문화:

template <typename T> 
struct base_traits<derived<T> > {
    typedef T value_type;

    static value_type call_foo(derived<T>* x) { 
        return x->derived_foo(); 
    }
};

이 접근 방식 특성을 통해 파생 클래스의 유형과 함수를 모두 사용할 수 있습니다. 각 템플릿 인수에 대해 base_traits를 특수화함으로써 각 파생 클래스에 필요한 멤버를 제공할 수 있습니다.

위 내용은 C 파생 클래스에서 CRTP 및 Typedef를 사용할 때 컴파일 시간 오류를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.