2017-01-03 9 views
1
#include <iostream> 
#include <functional> 

using namespace std; 

class Child; 

class Parent { 
    public: 
    template <class Function, class... Args> 
    void f(Function&& f, Args&&... args) 
    { 
     Child *c = dynamic_cast<Child*>(this); 
     cout << c->n; 
    } 
}; 

class Child : public Parent { 

public: 
    int n = 0; 
}; 

int main() 
{ 
    Parent *p = new Child(); 
    cout << "abc"; 
    return 0; 
} 

코드는 부모의 템플릿 멤버 함수에서 자식 클래스의 멤버에 액세스하려고합니다. 템플릿 멤버 함수가 가상 일 수 없기 때문에이 작업을 수행하고 싶습니다. 내가 가진 오류는 : " '하위'는 불완전한 유형입니다." 이 작업을 어떻게 수행합니까?상위 템플릿 기능에서 하위 멤버에 액세스하는 방법은 무엇입니까?

답변

3

f의 정의와 선언을 분리하고 Child 클래스의 정의 뒤에 정의를 이동할 수 있습니다. 예 : dynamic_cast를 사용하는

  1. 기본 클래스 Parentpolymorphic type을해야합니다

    class Child; 
    
    class Parent { 
    public: 
        virtual ~Parent() = default;   // must be polymorphic type 
        template <class Function, class... Args> 
        void f(Function&& f, Args&&... args); // the declaration 
    }; 
    
    class Child : public Parent { 
    public: 
        int n = 0; 
    }; 
    
    // the definition 
    template <class Function, class... Args> 
    void Parent::f(Function&& f, Args&&... args) 
    { 
        Child *c = dynamic_cast<Child*>(this); 
        if (c != nullptr)      // check the result of conversion 
         cout << c->n; 
    } 
    

    하는 것으로, 즉 적어도 하나의 virtual 기능이 있어야합니다.

  2. 사용하기 전에 dynamic_cast의 결과를 확인하는 것이 좋습니다.