2009-05-14 2 views
1

나는 정말로 변경하고 싶지 않지만 확장하고 싶은 클래스를 제공하고 있습니다. 저는 템플릿 클래스에 적용된 Decorator 패턴을 실험하는 패턴 및 템플릿 초보자입니다. Template 클래스는 또 다른 클래스에서 (의미를 정확히 이해한다면) 멤버에 대한 포인터를 포함합니다. member-to-member는 XML istream의 디시리얼라이저입니다. 'T'유형은 직렬화 될 XML 문서 유형입니다.템플릿 기본 클래스 함수 포인터 유형에 액세스

template <typename T> class B { 
public: 
    typedef std::auto_ptr<T> MYFUN( 
    std::istream&, const std::string&, const std::string&); 

public: 
    B<T>(MYFUN* p); 

private: 
    MYFUN *fptr; 
    std::string aString1; 
    std::string aString2; 

}};

typedef입니다은 http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.5을 읽은 후 나에게 이상한보고, 아직이 클래스는 그대로 잘 작동하는 것 같다. 제공된 헤더 파일에는 추가 #define이 없으므로 약간 신비 스럽습니다. 이 컴파일하려고 할 때

template <typename T> 
class D : public class B<T> 
{ 
    D(B<T>::MYFUN *fPtr, B<T> *providedBase); //compiler complaint 
    //Looks like B 
    private: 
    B* base_; 

}; 

template <typename T> 
D<T>::D(B<T>::MYFUN *p, B<T> *base) //compiler complaint 
: 
B<T>::B(p), base_(providedBase) 
{ } 

, 내가에서 구문 불만을 얻을 :

지금 내가 MYFUN에 의해 ​​반환되는 auto_ptr은 객체에 조금 더 일을 원하기 때문에 실내 장식으로, 그것을 확장하려고 두 줄을 표시합니다. 오류는 '예상'과 같음) 'at *'입니다. MYFUN에 대한 불만은 없습니다.

I는 D와 동일한 서명 D의 포인터 - 대 - 부재 - 정의 다시

, 즉

이 작동
//change MYFUN to NEWFUN in D) 
typedef std::auto_ptr<T> MYNEWFUN( 
    std::istream&, const std::string&, const std::string&); 

. 필자는 B를 만들 수있는 모든 D/Decorator에 대해이 작업을 수행하지 않는 것을 선호합니다. 전 typedef를 전역 적으로 수행하려고했지만 정의되지 않은 템플릿 매개 변수 때문에 구문을 올바르게 가져올 수 없습니다.

답변

0

컴파일 오류는 컴파일러가이 유형에 대해 얘기 말할 수 있다는 사실 때문입니다.

시도 :

D(typename B<T>::MYFUN *fPtr, B<T> *providedBase); 

template <typename T> 
D<T>::D(typename B<T>::MYFUN *p, B<T> *base) 

참조 :이 필요하지만 요약 그 때문에 템플릿 특수화의 가능성의 이유에 대한 자세한 내용은 the templates section of the C++ FAQ Lite는 방법이 없습니다 컴파일러가 실제로 B<T>::MYFUN이 유형을 참조하는지 확인하십시오.

+0

을 왼쪽으로 '공개'선언 – user106740

1

B에서 MYFUN typedef의 정의는 개인적인 가시성으로 수행됩니다. D가 액세스 할 수 없습니다. 보호 또는 공개로 변경하면 작동합니까?

template <typename T> class B { 
    protected: 
    typedef std::auto_ptr<T> MYFUN( 
     std::istream&, const std::string&, const std::string&); 
... 
}; 
+0

내가 실수로 내가 실수로 그것의 '공개'선언 – user106740

0

나는이 함께 볼 수있는 문제는 B :: MYFUN가 개인 형식 정의 것입니다.

따라서 상속하는 클래스는 액세스 할 수 없습니다.

변경이에 :

template <typename T> class B 
{ 
public: 
    typedef std::auto_ptr<T> MYFUN( std::istream&, const std::string&, const std::string&); 
public: 
    B<T>(MYFUN* p); 
private: 
    MYFUN *fptr; 
std::string aString1; 
std::string aString2; 
}; 
+0

을 중단! 매우 감사합니다!! – user106740