C의 정적 다형성 및 형식 정의
CRTP(Curiously Recurring Template Pattern)는 C에서 정적 다형성을 달성하는 기술입니다. 그러나 파생된 유형을 기반으로 반환 유형을 수정하기 위해 이 패턴을 일반화하려고 하면 MSVC 2010을 사용하는 사용자가 겪은 것처럼 코드가 컴파일되지 않을 수 있습니다.
문제:
파생 클래스에서 다양한 반환 유형을 허용하기 위한 다음 코드는 실패합니다. compile:
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(); } };
발생한 오류는 "'파생'의 멤버가 아닙니다.'"입니다. 이는 파생 유형이 기본 클래스의 템플릿 인수로 사용될 때 불완전하기 때문에 발생합니다.
특성을 사용한 솔루션:
일반적인 해결 방법은 특성 클래스 템플릿을 사용하는 것입니다. 이 접근 방식에서는 파생 클래스의 유형과 함수를 모두 캡슐화하기 위해 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)); } }; template <typename T> struct derived : base<derived<T>> { typedef typename base_traits<derived>::value_type value_type; value_type derived_foo() { return value_type(); } }; 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 특성은 이상하게 반복되는 템플릿 패턴에서 정적 다형성 및 Typedef와 관련된 컴파일 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!