문제

나는 정말로 변화하고 싶지 않다는 수업이 있었지만 확장하고 싶다. 나는 템플릿 클래스에 적용되는 데코레이터 패턴으로 실험하는 패턴과 템플릿 초보자입니다. 템플릿 클래스에는 또 다른 클래스에서 포인터 투 인원 (의미론을 올바르게 이해하는 경우)이 포함되어 있습니다. 포인터 투 인원은 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, 그러나이 수업은 잘 작동하는 것 같습니다. 제공된 헤더 파일에는 추가 #Defines가 없으므로 이것은 나에게 약간 신비합니다.

이제 나는 MyFun에 의해 반환 된 Auto_PTR 객체에 대해 조금 더 많은 작업을하고 싶기 때문에 데코레이터로 확장하려고합니다.

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이 정의되지 않은 것에 대한 불만은 없습니다.

D에서와 동일한 서명으로 D의 포인터 투 인원을 다시 정의 할 때, 즉

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

이것은 작동합니다. 나는 B로 만들 수있는 모든 d/데코레이터에 대해 이것을 할 필요가 없다는 것을 선호하지 않습니다. 나는 전 세계적으로 typedef를 더 많이 수행하려고했지만 템플릿 매개 변수가 정의되지 않아 구문을 올바르게 얻을 수 없었습니다.

도움이 되었습니까?

해결책

컴파일 오류는 컴파일러가 유형에 대해 이야기하고 있다고 말할 수 없기 때문입니다.

노력하다:

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

그리고

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

보다: C ++ FAQ 라이트의 템플릿 섹션 이것이 필요한 이유에 대한 자세한 내용은 템플릿 전문화의 가능성으로 인해 컴파일러가이를 확인할 수있는 방법이 없다는 것입니다. B<T>::MYFUN 실제로 유형을 참조하고 있습니다.

다른 팁

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

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

내가 이것으로 보는 문제는 b :: myfun이 사적인 typedef.

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

이것을 다음으로 변경하십시오.

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;
};
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top